Fixed #17717 (again) -- Used the new API for concrete models added in r17573. Many thanks to Simon Charette and Anssi Kääriäinen.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17643 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2012-03-03 21:34:51 +00:00
parent 7ce1ad7c03
commit dd441701ce
3 changed files with 14 additions and 7 deletions

View File

@ -43,8 +43,8 @@ class Serializer(object):
self.start_object(obj) self.start_object(obj)
# Use the concrete parent class' _meta instead of the object's _meta # Use the concrete parent class' _meta instead of the object's _meta
# This is to avoid local_fields problems for proxy models. Refs #17717. # This is to avoid local_fields problems for proxy models. Refs #17717.
concrete_class = obj._meta.proxy_for_model or obj.__class__ concrete_model = obj._meta.concrete_model
for field in concrete_class._meta.local_fields: for field in concrete_model._meta.local_fields:
if field.serialize: if field.serialize:
if field.rel is None: if field.rel is None:
if self.selected_fields is None or field.attname in self.selected_fields: if self.selected_fields is None or field.attname in self.selected_fields:
@ -52,7 +52,7 @@ class Serializer(object):
else: else:
if self.selected_fields is None or field.attname[:-3] in self.selected_fields: if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
self.handle_fk_field(obj, field) self.handle_fk_field(obj, field)
for field in concrete_class._meta.many_to_many: for field in concrete_model._meta.many_to_many:
if field.serialize: if field.serialize:
if self.selected_fields is None or field.attname in self.selected_fields: if self.selected_fields is None or field.attname in self.selected_fields:
self.handle_m2m_field(obj, field) self.handle_m2m_field(obj, field)

View File

@ -263,6 +263,10 @@ class ProxyBaseModel(BaseModel):
class Meta: class Meta:
proxy = True proxy = True
class ProxyProxyBaseModel(ProxyBaseModel):
class Meta:
proxy = True
class LengthModel(models.Model): class LengthModel(models.Model):
data = models.IntegerField() data = models.IntegerField()

View File

@ -41,8 +41,8 @@ from .models import (BooleanData, CharData, DateData, DateTimeData, EmailData,
GenericIPAddressPKData, PhonePKData, PositiveIntegerPKData, GenericIPAddressPKData, PhonePKData, PositiveIntegerPKData,
PositiveSmallIntegerPKData, SlugPKData, SmallPKData, USStatePKData, PositiveSmallIntegerPKData, SlugPKData, SmallPKData, USStatePKData,
AutoNowDateTimeData, ModifyingSaveData, InheritAbstractModel, BaseModel, AutoNowDateTimeData, ModifyingSaveData, InheritAbstractModel, BaseModel,
ExplicitInheritBaseModel, InheritBaseModel, ProxyBaseModel, BigIntegerData, ExplicitInheritBaseModel, InheritBaseModel, ProxyBaseModel,
LengthModel, Tag, ComplexModel) ProxyProxyBaseModel, BigIntegerData, LengthModel, Tag, ComplexModel)
# A set of functions that can be used to recreate # A set of functions that can be used to recreate
# test data objects of various kinds. # test data objects of various kinds.
@ -410,11 +410,14 @@ class SerializerTests(TestCase):
def test_serialize_proxy_model(self): def test_serialize_proxy_model(self):
BaseModel.objects.create(parent_data=1) BaseModel.objects.create(parent_data=1)
base_objects = BaseModel.objects.all() base_objects = BaseModel.objects.all()
proxy_objects = ProxyBaseModel.objects.all() proxy_objects = ProxyBaseModel.objects.all()
base_data = serializers.serialize("json", base_objects) proxy_proxy_objects = ProxyProxyBaseModel.objects.all()
base_data = serializers.serialize("json", base_objects)
proxy_data = serializers.serialize("json", proxy_objects) proxy_data = serializers.serialize("json", proxy_objects)
proxy_proxy_data = serializers.serialize("json", proxy_proxy_objects)
self.assertEqual(base_data, proxy_data.replace('proxy', '')) self.assertEqual(base_data, proxy_data.replace('proxy', ''))
self.assertEqual(base_data, proxy_proxy_data.replace('proxy', ''))
def serializerTest(format, self): def serializerTest(format, self):