Commit 62347208 authored by Tim Graham's avatar Tim Graham
Browse files

[1.8.x] Fixed #24525 -- Fixed AssertionError in some complex queries.

Thanks Anssi Kääriäinen for providing the solution.

Backport of 2dc9ec56 from master
parent f1d6b5b5
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -539,6 +539,7 @@ 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)
            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
+2 −0
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -45,6 +45,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, blank=True, null=True)

    class Meta:
        ordering = ['note']
+22 −2
Original line number Diff line number Diff line
@@ -1177,6 +1177,15 @@ class Queries1Tests(BaseQuerysetTest):
            self.assertEqual(len(w), 1)
            self.assertTrue(issubclass(w[0].category, RemovedInDjango19Warning))

    def test_lookup_constraint_fielderror(self):
        msg = (
            "Cannot resolve keyword 'unknown_field' into field. Choices are: "
            "annotation, category, category_id, children, id, item, "
            "managedmodel, name, note, parent, parent_id"
        )
        with self.assertRaisesMessage(FieldError, msg):
            Tag.objects.filter(unknown_field__name='generic')


class Queries2Tests(TestCase):
    @classmethod
@@ -1319,8 +1328,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)
@@ -1335,6 +1344,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,