Fixed #9546: GenericRelations inherited from base models no longer query using the wrong content type.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10373 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
c6c25adf6d
commit
595c092a29
|
@ -193,9 +193,9 @@ class ReverseGenericRelatedObjectsDescriptor(object):
|
||||||
rel_model = self.field.rel.to
|
rel_model = self.field.rel.to
|
||||||
superclass = rel_model._default_manager.__class__
|
superclass = rel_model._default_manager.__class__
|
||||||
RelatedManager = create_generic_related_manager(superclass)
|
RelatedManager = create_generic_related_manager(superclass)
|
||||||
|
|
||||||
qn = connection.ops.quote_name
|
qn = connection.ops.quote_name
|
||||||
|
|
||||||
manager = RelatedManager(
|
manager = RelatedManager(
|
||||||
model = rel_model,
|
model = rel_model,
|
||||||
instance = instance,
|
instance = instance,
|
||||||
|
@ -203,7 +203,7 @@ class ReverseGenericRelatedObjectsDescriptor(object):
|
||||||
join_table = qn(self.field.m2m_db_table()),
|
join_table = qn(self.field.m2m_db_table()),
|
||||||
source_col_name = qn(self.field.m2m_column_name()),
|
source_col_name = qn(self.field.m2m_column_name()),
|
||||||
target_col_name = qn(self.field.m2m_reverse_name()),
|
target_col_name = qn(self.field.m2m_reverse_name()),
|
||||||
content_type = ContentType.objects.get_for_model(self.field.model),
|
content_type = ContentType.objects.get_for_model(instance),
|
||||||
content_type_field_name = self.field.content_type_field_name,
|
content_type_field_name = self.field.content_type_field_name,
|
||||||
object_id_field_name = self.field.object_id_field_name
|
object_id_field_name = self.field.object_id_field_name
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
from django.db import models
|
||||||
|
from django.contrib.contenttypes import generic
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
|
||||||
|
class Link(models.Model):
|
||||||
|
content_type = models.ForeignKey(ContentType)
|
||||||
|
object_id = models.PositiveIntegerField()
|
||||||
|
content_object = generic.GenericForeignKey()
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return "Link to %s id=%s" % (self.content_type, self.object_id)
|
||||||
|
|
||||||
|
class Place(models.Model):
|
||||||
|
name = models.CharField(max_length=100)
|
||||||
|
links = generic.GenericRelation(Link)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return "Place: %s" % self.name
|
||||||
|
|
||||||
|
class Restaurant(Place):
|
||||||
|
def __unicode__(self):
|
||||||
|
return "Restaurant: %s" % self.name
|
|
@ -0,0 +1,19 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
from models import Link, Place, Restaurant
|
||||||
|
|
||||||
|
class GenericRelationTests(TestCase):
|
||||||
|
|
||||||
|
def test_inherited_models_content_type(self):
|
||||||
|
"""
|
||||||
|
Test that GenericRelations on inherited classes use the correct content
|
||||||
|
type.
|
||||||
|
"""
|
||||||
|
|
||||||
|
p = Place.objects.create(name="South Park")
|
||||||
|
r = Restaurant.objects.create(name="Chubby's")
|
||||||
|
l1 = Link.objects.create(content_object=p)
|
||||||
|
l2 = Link.objects.create(content_object=r)
|
||||||
|
self.assertEqual(list(p.links.all()), [l1])
|
||||||
|
self.assertEqual(list(r.links.all()), [l2])
|
||||||
|
|
Loading…
Reference in New Issue