From c1584383fa7b83b9c00a40a1f0b367b91f2f7382 Mon Sep 17 00:00:00 2001 From: Justin Bronn Date: Fri, 22 Jan 2010 18:39:48 +0000 Subject: [PATCH] Fixed #12664 -- Fixed `GenericRelation.m2m_reverse_name` to return the correct pk column name. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12276 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/contenttypes/generic.py | 2 +- .../generic_relations_regress/models.py | 28 ++++++++++++++++--- .../generic_relations_regress/tests.py | 23 +++++++++++---- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/django/contrib/contenttypes/generic.py b/django/contrib/contenttypes/generic.py index 1b2d8b7d96..705b62e7cf 100644 --- a/django/contrib/contenttypes/generic.py +++ b/django/contrib/contenttypes/generic.py @@ -129,7 +129,7 @@ class GenericRelation(RelatedField, Field): return self.object_id_field_name def m2m_reverse_name(self): - return self.model._meta.pk.column + return self.rel.to._meta.pk.column def contribute_to_class(self, cls, name): super(GenericRelation, self).contribute_to_class(cls, name) diff --git a/tests/regressiontests/generic_relations_regress/models.py b/tests/regressiontests/generic_relations_regress/models.py index 1a4826aaed..8192dc60d3 100644 --- a/tests/regressiontests/generic_relations_regress/models.py +++ b/tests/regressiontests/generic_relations_regress/models.py @@ -13,10 +13,30 @@ class Link(models.Model): 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): + +class Restaurant(Place): def __unicode__(self): - return "Restaurant: %s" % self.name \ No newline at end of file + return "Restaurant: %s" % self.name + +class Address(models.Model): + street = models.CharField(max_length=80) + city = models.CharField(max_length=50) + state = models.CharField(max_length=2) + zipcode = models.CharField(max_length=5) + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey() + + def __unicode__(self): + return '%s %s, %s %s' % (self.street, self.city, self.state, self.zipcode) + +class Person(models.Model): + account = models.IntegerField(primary_key=True) + name = models.CharField(max_length=128) + addresses = generic.GenericRelation(Address) + + def __unicode__(self): + return self.name diff --git a/tests/regressiontests/generic_relations_regress/tests.py b/tests/regressiontests/generic_relations_regress/tests.py index 6f0863d7b4..e1cc85dcdc 100644 --- a/tests/regressiontests/generic_relations_regress/tests.py +++ b/tests/regressiontests/generic_relations_regress/tests.py @@ -1,19 +1,32 @@ from django.test import TestCase from django.contrib.contenttypes.models import ContentType -from models import Link, Place, Restaurant +from models import Link, Place, Restaurant, Person, Address 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") + 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 + + def test_reverse_relation_pk(self): + """ + Test that the correct column name is used for the primary key on the + originating model of a query. See #12664. + """ + p = Person.objects.create(account=23, name='Chef') + a = Address.objects.create(street='123 Anywhere Place', + city='Conifer', state='CO', + zipcode='80433', content_object=p) + + qs = Person.objects.filter(addresses__zipcode='80433') + self.assertEqual(1, qs.count()) + self.assertEqual('Chef', qs[0].name)