2
0
Эх сурвалжийг харах

Fixed #24525 -- Fixed AssertionError in some complex queries.

Thanks Anssi Kääriäinen for providing the solution.
Tim Graham 9 жил өмнө
parent
commit
2dc9ec5616

+ 2 - 1
django/db/models/sql/query.py

@@ -556,7 +556,8 @@ class Query(object):
             # distinct joins for the same connection in rhs query, then the
             # combined query must have two joins, too.
             reuse.discard(new_alias)
-            change_map[alias] = new_alias
+            if alias != new_alias:
+                change_map[alias] = new_alias
             if not rhs.alias_refcount[alias]:
                 # The alias was unused in the rhs query. Unref it so that it
                 # will be unused in the new query, too. We have to add and

+ 2 - 0
docs/releases/1.8.5.txt

@@ -14,6 +14,8 @@ Bugfixes
 * Fixed ``AssertionError`` in some delete queries with a model containing a
   field that is both a foreign and primary key (:ticket:`24951`).
 
+* Fixed ``AssertionError`` in some complex queries (:ticket:`24525`).
+
 * Fixed a migrations crash with ``GenericForeignKey`` (:ticket:`25040`).
 
 * Made ``translation.override()`` clear the overridden language when a

+ 1 - 0
tests/queries/models.py

@@ -49,6 +49,7 @@ class Tag(models.Model):
 class Note(models.Model):
     note = models.CharField(max_length=100)
     misc = models.CharField(max_length=10)
+    tag = models.ForeignKey(Tag, models.SET_NULL, blank=True, null=True)
 
     class Meta:
         ordering = ['note']

+ 14 - 3
tests/queries/tests.py

@@ -1180,7 +1180,7 @@ class Queries1Tests(BaseQuerysetTest):
         msg = (
             "Cannot resolve keyword 'unknown_field' into field. Choices are: "
             "annotation, category, category_id, children, id, item, "
-            "managedmodel, name, parent, parent_id"
+            "managedmodel, name, note, parent, parent_id"
         )
         with self.assertRaisesMessage(FieldError, msg):
             Tag.objects.filter(unknown_field__name='generic')
@@ -1326,8 +1326,8 @@ class Queries4Tests(BaseQuerysetTest):
         generic = NamedCategory.objects.create(name="Generic")
         cls.t1 = Tag.objects.create(name='t1', category=generic)
 
-        n1 = Note.objects.create(note='n1', misc='foo', id=1)
-        n2 = Note.objects.create(note='n2', misc='bar', id=2)
+        n1 = Note.objects.create(note='n1', misc='foo')
+        n2 = Note.objects.create(note='n2', misc='bar')
 
         e1 = ExtraInfo.objects.create(info='e1', note=n1)
         e2 = ExtraInfo.objects.create(info='e2', note=n2)
@@ -1342,6 +1342,17 @@ class Queries4Tests(BaseQuerysetTest):
         Item.objects.create(name='i1', created=datetime.datetime.now(), note=n1, creator=cls.a1)
         Item.objects.create(name='i2', created=datetime.datetime.now(), note=n1, creator=cls.a3)
 
+    def test_ticket24525(self):
+        tag = Tag.objects.create()
+        anth100 = tag.note_set.create(note='ANTH', misc='100')
+        math101 = tag.note_set.create(note='MATH', misc='101')
+        s1 = tag.annotation_set.create(name='1')
+        s2 = tag.annotation_set.create(name='2')
+        s1.notes = [math101, anth100]
+        s2.notes = [math101]
+        result = math101.annotation_set.all() & tag.annotation_set.exclude(notes__in=[anth100])
+        self.assertEqual(list(result), [s2])
+
     def test_ticket11811(self):
         unsaved_category = NamedCategory(name="Other")
         with six.assertRaisesRegex(self, ValueError,