Opened 9 years ago

Closed 3 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 Tim Graham)

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 Anssi Kääriäinen, 9 years ago

Triage Stage: UnreviewedAccepted

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)).

comment:2 by Brian McDonnell, 9 years ago

Owner: changed from nobody to Brian McDonnell
Status: newassigned

comment:3 by Brian McDonnell, 9 years ago

Owner: Brian McDonnell removed
Status: assignednew

comment:4 by Niels Van Och, 9 years ago

Owner: set to Niels Van Och
Status: newassigned

comment:5 by Niels Van Och, 9 years ago

Owner: Niels Van Och removed
Status: assignednew

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 Tim Graham, 9 years ago

Description: modified (diff)

comment:7 by Sergey Fedoseev, 7 years ago

Owner: set to Sergey Fedoseev
Status: newassigned

comment:8 by Mariusz Felisiak, 3 years ago

Owner: Sergey Fedoseev removed
Status: assignednew

comment:9 by Mariusz Felisiak, 3 years ago

Resolution: fixed
Status: newclosed

Fixed in c979c0a2b8abca325a549961fd7a17bdc36bcb1f. You can set can_use_none_as_rhs = True to skip this check.

Note: See TracTickets for help on using tickets.
Back to Top