#32684: Annotate query with Subquery with None value cannot be reliably filtered
(or excluded)
-------------------------------------+-------------------------------------
     Reporter:  Gerben Morsink       |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  3.1
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:  annotate, Subquery   |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by Gerben Morsink:

Old description:

> Let's say I have the following query
>
> {{{
>         last_location = Subquery(PersonLocation.objects.filter(
>             person=OuterRef('id'),
> departure_date=None).order_by('-arrival_date').values('location')[:1])
>
>         persons1 =
> Person.objects_with_inactive.annotate(current_location=last_location)
> }}}
> Where PersonLocation is the table connecting the Person to a Location (to
> keep track of the location history of a person).
>
> And further in the code I do:
>

> {{{
>         persons2 = persons1.exclude(current_location=location.id)
> }}}
> This will always return an empty queryset. Even if in persons1 there are
> person objects that have `current_location = None` annotated.
> This is very counter-intuitive, right?
>
> I'm also not aware of a way to fix this. I tried
> `persons1.filter(~Q(current_location=location.id))`, but the result is
> the same.

New description:

 Let's say I have the following query

 {{{
         last_location = Subquery(PersonLocation.objects.filter(
             person=OuterRef('id'),
 departure_date=None).order_by('-arrival_date').values('location')[:1])

         persons1 =
 Person.objects_with_inactive.annotate(current_location=last_location)
 }}}
 Where PersonLocation is the table connecting the Person to a Location (to
 keep track of the location history of a person).

 And further in the code I do:


 {{{
         persons2 = persons1.exclude(current_location=location.id)
 }}}
 This will always return an empty queryset. Even if in persons1 there are
 person objects that have `current_location = None` annotated.
 This is very counter-intuitive, right?

 I'm also not aware of a way to fix this. I tried
 `persons1.filter(~Q(current_location=location.id))`, but the result is the
 same.

 NOTE: the location.id is a UUID, not sure if that makes a difference
 though.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32684#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/064.19337bfcd83aa983605049643a633abf%40djangoproject.com.

Reply via email to