#2271 closed defect (fixed)
__exact is only optional for top level queries
Reported by: | Russell Keith-Magee | Owned by: | Russell Keith-Magee |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | normal | Keywords: | __exact query |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Django documentation states that:
If you don't provide a lookup type -- that is, if your keyword argument doesn't contain a double underscore -- the lookup type is assumed to be exact.
For example, the following two statements are equivalent:
Blog.objects.get(id=14) Blog.objects.get(id__exact=14)
This is for convenience, because exact lookups are the common case.
While this is true for the provided example, it is not true for joined queries:
Blog.objects.get(author__id=14) Blog.objects.get(author__id__exact=14)
The second query works - the first one fails because "id" is not a valid query term.
The fault appears to be in the code in parse_lookup that does pk 'faking' of queries - this code relies upon a query size of 1 to determin the assumed __exact, which fails if there are multiple query terms.
Change History (3)
comment:1 by , 18 years ago
comment:2 by , 18 years ago
Yes, that is what I am suggesting. There are some edge cases where this will fail with models that have query terms as field names, but these edge cases would continue to work as long as queries were fully expressed.
comment:3 by , 18 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
So should the query parser just append "exact" if the last word isn't a lookup type?