From 0e3704963693ddfaaa525054c42333f6ffdb4b47 Mon Sep 17 00:00:00 2001 From: Anssi Kääriäinen Date: Mon, 28 Apr 2014 15:27:36 +0300 Subject: [1.6.x] Fixed #22429 -- Incorrect SQL when using ~Q and F Backpatch of 5e1f4656b98816c96a1cc051224c1b699db480e0 from master. Conflicts: django/db/models/sql/query.py tests/queries/models.py tests/queries/tests.py --- tests/queries/models.py | 15 +++++++++++++++ tests/queries/tests.py | 18 +++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/queries/models.py b/tests/queries/models.py index 6d9e35d0bf..431d3c0501 100644 --- a/tests/queries/models.py +++ b/tests/queries/models.py @@ -536,3 +536,18 @@ class Ticket21203Parent(models.Model): class Ticket21203Child(models.Model): childid = models.AutoField(primary_key=True) parent = models.ForeignKey(Ticket21203Parent) + + +# Bug #22429 + +class School(models.Model): + pass + + +class Student(models.Model): + school = models.ForeignKey(School) + + +class Classroom(models.Model): + school = models.ForeignKey(School) + students = models.ManyToManyField(Student, related_name='classroom') diff --git a/tests/queries/tests.py b/tests/queries/tests.py index e38d573e80..833f65f738 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -27,7 +27,8 @@ from .models import ( ModelA, ModelB, ModelC, ModelD, Responsibility, Job, JobResponsibilities, BaseA, FK1, Identifier, Program, Channel, Page, Paragraph, Chapter, Book, MyObject, Order, OrderItem, Task, Staff, StaffUser, Ticket21203Parent, - Ticket21203Child) + Ticket21203Child, Classroom, School, Student) + class BaseQuerysetTest(TestCase): def assertValueQuerysetEqual(self, qs, values): @@ -3105,3 +3106,18 @@ class ForeignKeyToBaseExcludeTests(TestCase): SpecialCategory.objects.filter(categoryitem__id=c1.pk), [sc1], lambda x: x ) + + +class Ticket22429Tests(TestCase): + def test_ticket_22429(self): + sc1 = School.objects.create() + st1 = Student.objects.create(school=sc1) + + sc2 = School.objects.create() + st2 = Student.objects.create(school=sc2) + + cr = Classroom.objects.create(school=sc1) + cr.students.add(st1) + + queryset = Student.objects.filter(~Q(classroom__school=F('school'))) + self.assertQuerysetEqual(queryset, [st2], lambda x: x) -- cgit v1.3