Opened 10 years ago
Closed 4 years ago
#23572 closed Bug (fixed)
Exception on Custom Lookups when right value is None.
Reported by: | maherma-adg | Owned by: | |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 1.7 |
Severity: | Normal | Keywords: | custom lookup, db |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
For my current project I need generate a complex queryset filter and I decide implement as custom lookup.
I got the example as base to create custom lookup, but during test, this expression:
data = Rsce.filter(duration__ne = None)
throws an exception. Any other expression runs smoothly.
Looking into code exception are thrown in this piece of code:
if value is None: if lookups[-1] not in ('exact', 'iexact'): raise ValueError("Cannot use None as a query value")
IMHO the check in lookups must be avoided on custom lookups, allowing them to manage None values by themselves.
Change History (9)
comment:1 by , 10 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 by , 10 years ago
Owner: | changed from | to
---|---|
Status: | new → assigned |
comment:3 by , 10 years ago
Owner: | removed |
---|---|
Status: | assigned → new |
comment:4 by , 10 years ago
Owner: | set to |
---|---|
Status: | new → assigned |
comment:5 by , 10 years ago
Owner: | removed |
---|---|
Status: | assigned → new |
I had a look at this, but couldn't find a good place/pattern to put it in. The problem is that the behavior of the two lookups that currently act different (exact and iexact) is tricky to implement, because you need to have already constructed your Lookup object, but then replace it by a different one. If anyone has a good idea about a structure to solve this, I'd be happy to take another crack (although realistically, that person could probably also complete the patch easily).
comment:6 by , 9 years ago
Description: | modified (diff) |
---|
comment:7 by , 7 years ago
Owner: | set to |
---|---|
Status: | new → assigned |
comment:8 by , 4 years ago
Owner: | removed |
---|---|
Status: | assigned → new |
comment:9 by , 4 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Fixed in c979c0a2b8abca325a549961fd7a17bdc36bcb1f. You can set can_use_none_as_rhs = True
to skip this check.
Yes, it seems this check belongs to the Lookup (with a base implementation that raises the ValueError).
BTW you are likely going to stumble upon some other limitations in the current Lookup implementation. A
.exclude(duration__ne=None)
call might not work as expected (that is, return complement of.filter(duration__ne=None)
).