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.
This commit is contained in:
Anssi Kääriäinen 2013-05-20 17:40:34 +03:00
parent d9d24c4521
commit c9a96075fa
3 changed files with 30 additions and 1 deletions

View File

@ -157,6 +157,8 @@ class Field(object):
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 File

@ -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 File

@ -4,7 +4,7 @@ from django.test import TestCase, skipIfDBFeature
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 @@ class GenericRelationTests(TestCase):
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)