Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #20378 -- regression in GenericRelation on abstract model

When a GenericRelation was defined on abstract model, queries on childs
of the abstract model didn't work. The problem was in the way fields and
in particular field.rel was copied from models to their children.

The regression was likely caused by #19385. Thanks to Gavin Wahl for
spotting the regression.
  • Loading branch information...
commit c9a96075fa02b6d52bec748ffdfb413688a15774 1 parent d9d24c4
@akaariai akaariai authored
View
2  django/db/models/fields/__init__.py
@@ -157,6 +157,8 @@ def __deepcopy__(self, memodict):
obj = copy.copy(self)
if self.rel:
obj.rel = copy.copy(self.rel)
+ if hasattr(self.rel, 'field') and self.rel.field is self:
+ obj.rel.field = obj
memodict[id(self)] = obj
return obj
View
9 tests/generic_relations_regress/models.py
@@ -122,3 +122,12 @@ class Tag(models.Model):
class Board(models.Model):
name = models.CharField(primary_key=True, max_length=15)
+
+class HasLinks(models.Model):
+ links = generic.GenericRelation(Link)
+
+ class Meta:
+ abstract = True
+
+class HasLinkThing(HasLinks):
+ pass
View
20 tests/generic_relations_regress/tests.py
@@ -4,7 +4,7 @@
from .models import (Address, Place, Restaurant, Link, CharLink, TextLink,
Person, Contact, Note, Organization, OddRelation1, OddRelation2, Company,
- Developer, Team, Guild, Tag, Board)
+ Developer, Team, Guild, Tag, Board, HasLinkThing)
class GenericRelationTests(TestCase):
@@ -135,3 +135,21 @@ def test_gfk_to_model_with_empty_pk(self):
b1 = Board.objects.create(name='')
tag = Tag(label='VP', content_object=b1)
tag.save()
+
+ def test_ticket_20378(self):
+ hs1 = HasLinkThing.objects.create()
+ hs2 = HasLinkThing.objects.create()
+ l1 = Link.objects.create(content_object=hs1)
+ l2 = Link.objects.create(content_object=hs2)
+ self.assertQuerysetEqual(
+ HasLinkThing.objects.filter(links=l1),
+ [hs1], lambda x: x)
+ self.assertQuerysetEqual(
+ HasLinkThing.objects.filter(links=l2),
+ [hs2], lambda x: x)
+ self.assertQuerysetEqual(
+ HasLinkThing.objects.exclude(links=l2),
+ [hs1], lambda x: x)
+ self.assertQuerysetEqual(
+ HasLinkThing.objects.exclude(links=l1),
+ [hs2], lambda x: x)

0 comments on commit c9a9607

Please sign in to comment.
Something went wrong with that request. Please try again.