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
This commit is contained in:
Justin Bronn 2010-01-22 18:39:48 +00:00
parent 5ec44450df
commit c1584383fa
3 changed files with 43 additions and 10 deletions

View File

@ -129,7 +129,7 @@ class GenericRelation(RelatedField, Field):
return self.object_id_field_name return self.object_id_field_name
def m2m_reverse_name(self): 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): def contribute_to_class(self, cls, name):
super(GenericRelation, self).contribute_to_class(cls, name) super(GenericRelation, self).contribute_to_class(cls, name)

View File

@ -13,10 +13,30 @@ class Link(models.Model):
class Place(models.Model): class Place(models.Model):
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
links = generic.GenericRelation(Link) links = generic.GenericRelation(Link)
def __unicode__(self): def __unicode__(self):
return "Place: %s" % self.name return "Place: %s" % self.name
class Restaurant(Place): class Restaurant(Place):
def __unicode__(self): def __unicode__(self):
return "Restaurant: %s" % self.name 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

View File

@ -1,19 +1,32 @@
from django.test import TestCase from django.test import TestCase
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from models import Link, Place, Restaurant from models import Link, Place, Restaurant, Person, Address
class GenericRelationTests(TestCase): class GenericRelationTests(TestCase):
def test_inherited_models_content_type(self): def test_inherited_models_content_type(self):
""" """
Test that GenericRelations on inherited classes use the correct content Test that GenericRelations on inherited classes use the correct content
type. type.
""" """
p = Place.objects.create(name="South Park") 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) l1 = Link.objects.create(content_object=p)
l2 = Link.objects.create(content_object=r) l2 = Link.objects.create(content_object=r)
self.assertEqual(list(p.links.all()), [l1]) self.assertEqual(list(p.links.all()), [l1])
self.assertEqual(list(r.links.all()), [l2]) self.assertEqual(list(r.links.all()), [l2])
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)