From 595c092a293396eab80c6da8654f6705a28c7431 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Fri, 3 Apr 2009 19:52:14 +0000 Subject: [PATCH] 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 --- django/contrib/contenttypes/generic.py | 6 ++--- .../generic_relations_regress/__init__.py | 0 .../generic_relations_regress/models.py | 22 +++++++++++++++++++ .../generic_relations_regress/tests.py | 19 ++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 tests/regressiontests/generic_relations_regress/__init__.py create mode 100644 tests/regressiontests/generic_relations_regress/models.py create mode 100644 tests/regressiontests/generic_relations_regress/tests.py diff --git a/django/contrib/contenttypes/generic.py b/django/contrib/contenttypes/generic.py index be67557805..0be1de6e63 100644 --- a/django/contrib/contenttypes/generic.py +++ b/django/contrib/contenttypes/generic.py @@ -193,9 +193,9 @@ class ReverseGenericRelatedObjectsDescriptor(object): rel_model = self.field.rel.to superclass = rel_model._default_manager.__class__ RelatedManager = create_generic_related_manager(superclass) - + qn = connection.ops.quote_name - + manager = RelatedManager( model = rel_model, instance = instance, @@ -203,7 +203,7 @@ class ReverseGenericRelatedObjectsDescriptor(object): join_table = qn(self.field.m2m_db_table()), source_col_name = qn(self.field.m2m_column_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, object_id_field_name = self.field.object_id_field_name ) diff --git a/tests/regressiontests/generic_relations_regress/__init__.py b/tests/regressiontests/generic_relations_regress/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/generic_relations_regress/models.py b/tests/regressiontests/generic_relations_regress/models.py new file mode 100644 index 0000000000..1a4826aaed --- /dev/null +++ b/tests/regressiontests/generic_relations_regress/models.py @@ -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 \ No newline at end of file diff --git a/tests/regressiontests/generic_relations_regress/tests.py b/tests/regressiontests/generic_relations_regress/tests.py new file mode 100644 index 0000000000..6f0863d7b4 --- /dev/null +++ b/tests/regressiontests/generic_relations_regress/tests.py @@ -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]) + \ No newline at end of file