Fixed #24525 -- Fixed AssertionError in some complex queries.
Thanks Anssi Kääriäinen for providing the solution.
This commit is contained in:
parent
e7b7f94678
commit
2dc9ec5616
|
@ -556,7 +556,8 @@ class Query(object):
|
||||||
# distinct joins for the same connection in rhs query, then the
|
# distinct joins for the same connection in rhs query, then the
|
||||||
# combined query must have two joins, too.
|
# combined query must have two joins, too.
|
||||||
reuse.discard(new_alias)
|
reuse.discard(new_alias)
|
||||||
change_map[alias] = new_alias
|
if alias != new_alias:
|
||||||
|
change_map[alias] = new_alias
|
||||||
if not rhs.alias_refcount[alias]:
|
if not rhs.alias_refcount[alias]:
|
||||||
# The alias was unused in the rhs query. Unref it so that it
|
# 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
|
# will be unused in the new query, too. We have to add and
|
||||||
|
|
|
@ -14,6 +14,8 @@ Bugfixes
|
||||||
* Fixed ``AssertionError`` in some delete queries with a model containing a
|
* Fixed ``AssertionError`` in some delete queries with a model containing a
|
||||||
field that is both a foreign and primary key (:ticket:`24951`).
|
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`).
|
* Fixed a migrations crash with ``GenericForeignKey`` (:ticket:`25040`).
|
||||||
|
|
||||||
* Made ``translation.override()`` clear the overridden language when a
|
* Made ``translation.override()`` clear the overridden language when a
|
||||||
|
|
|
@ -49,6 +49,7 @@ class Tag(models.Model):
|
||||||
class Note(models.Model):
|
class Note(models.Model):
|
||||||
note = models.CharField(max_length=100)
|
note = models.CharField(max_length=100)
|
||||||
misc = models.CharField(max_length=10)
|
misc = models.CharField(max_length=10)
|
||||||
|
tag = models.ForeignKey(Tag, models.SET_NULL, blank=True, null=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['note']
|
ordering = ['note']
|
||||||
|
|
|
@ -1180,7 +1180,7 @@ class Queries1Tests(BaseQuerysetTest):
|
||||||
msg = (
|
msg = (
|
||||||
"Cannot resolve keyword 'unknown_field' into field. Choices are: "
|
"Cannot resolve keyword 'unknown_field' into field. Choices are: "
|
||||||
"annotation, category, category_id, children, id, item, "
|
"annotation, category, category_id, children, id, item, "
|
||||||
"managedmodel, name, parent, parent_id"
|
"managedmodel, name, note, parent, parent_id"
|
||||||
)
|
)
|
||||||
with self.assertRaisesMessage(FieldError, msg):
|
with self.assertRaisesMessage(FieldError, msg):
|
||||||
Tag.objects.filter(unknown_field__name='generic')
|
Tag.objects.filter(unknown_field__name='generic')
|
||||||
|
@ -1326,8 +1326,8 @@ class Queries4Tests(BaseQuerysetTest):
|
||||||
generic = NamedCategory.objects.create(name="Generic")
|
generic = NamedCategory.objects.create(name="Generic")
|
||||||
cls.t1 = Tag.objects.create(name='t1', category=generic)
|
cls.t1 = Tag.objects.create(name='t1', category=generic)
|
||||||
|
|
||||||
n1 = Note.objects.create(note='n1', misc='foo', id=1)
|
n1 = Note.objects.create(note='n1', misc='foo')
|
||||||
n2 = Note.objects.create(note='n2', misc='bar', id=2)
|
n2 = Note.objects.create(note='n2', misc='bar')
|
||||||
|
|
||||||
e1 = ExtraInfo.objects.create(info='e1', note=n1)
|
e1 = ExtraInfo.objects.create(info='e1', note=n1)
|
||||||
e2 = ExtraInfo.objects.create(info='e2', note=n2)
|
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='i1', created=datetime.datetime.now(), note=n1, creator=cls.a1)
|
||||||
Item.objects.create(name='i2', created=datetime.datetime.now(), note=n1, creator=cls.a3)
|
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):
|
def test_ticket11811(self):
|
||||||
unsaved_category = NamedCategory(name="Other")
|
unsaved_category = NamedCategory(name="Other")
|
||||||
with six.assertRaisesRegex(self, ValueError,
|
with six.assertRaisesRegex(self, ValueError,
|
||||||
|
|
Loading…
Reference in New Issue