Opened 7 years ago

Closed 8 weeks 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 Changed 7 years ago by Anssi Kääriäinen

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 Changed 7 years ago by Brian McDonnell

Owner: changed from nobody to Brian McDonnell
Status: newassigned

comment:3 Changed 7 years ago by Brian McDonnell

Owner: Brian McDonnell deleted
Status: assignednew

comment:4 Changed 7 years ago by Niels Van Och

Owner: set to Niels Van Och
Status: newassigned

comment:5 Changed 7 years ago by Niels Van Och

Owner: Niels Van Och deleted
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 Changed 6 years ago by Tim Graham

Description: modified (diff)

comment:7 Changed 4 years ago by Sergey Fedoseev

Owner: set to Sergey Fedoseev
Status: newassigned

comment:8 Changed 5 months ago by Mariusz Felisiak

Owner: Sergey Fedoseev deleted
Status: assignednew

comment:9 Changed 8 weeks ago by Mariusz Felisiak

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