#30349: Using exclude on annotated FilteredRelation doesn't work
-------------------------------------+-------------------------------------
     Reporter:  Lucas Miller         |                    Owner:  robinh00d
         Type:  Bug                  |                   Status:  assigned
    Component:  Database layer       |                  Version:  master
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:  Accepted
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------

Comment (by Lucas Miller):

 Sure,

 i've added setup datas to have a more explicit test :

 {{{
 cls.author3 = Author.objects.create(name='Rob')
 cls.book5 = Book.objects.create(
             title='Poem by Rob B',
             editor=cls.editor_b,
             author=cls.author3,
         )
 }}}

 then i'm doing

 {{{
 self.assertSequenceEqual(
             Author.objects.annotate(
                 book_alice=FilteredRelation('book',
 condition=Q(book__title__startswith='The book by')),
             ).exclude(book_alice__title__contains="Jane"),
             [self.author1]
         )
 }}}

 this query should first get filter book starting with 'The book by' so
 books numbers 2, 3 and 4 then exclude all books containing 'Jane' in the
 name. We should end up with only the book 4.

 The result here is book4 and book5 :

 {{{
 ======================================================================
 FAIL: test_with_join_exclude
 (filtered_relation.tests.FilteredRelationTests)
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File
 "/home/lucas/dev/test/django_lucas/tests/filtered_relation/tests.py", line
 108, in test_with_join_exclude
     [self.author1]
 AssertionError: Sequences differ: <QuerySet [<Author: Alice>, <Author:
 Rob>]> != [<Author: Alice>]

 First sequence contains 1 additional elements.
 First extra element 1:
 <Author: Rob>

 - <QuerySet [<Author: Alice>, <Author: Rob>]>
 + [<Author: Alice>]
 }}}

 The generated SQL is :

 {{{
 SELECT
   "filtered_relation_author"."id",
   "filtered_relation_author"."name",
   "filtered_relation_author"."content_type_id",
   "filtered_relation_author"."object_id"
 FROM
   "filtered_relation_author"
 WHERE
   NOT (
     "filtered_relation_author"."id" IN (
       SELECT
         U1."author_id"
       FROM
         "filtered_relation_book" U1
       WHERE
         U1."title" LIKE % Jane % ESCAPE '\'
     )
   )
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/30349#comment:7>
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 post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/072.dc83f7256138277fca1f9034bf4a0ffd%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to