Fixed #17717 -- Fixed serialization of proxy models. Thanks, Anssi Kääriäinen.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17640 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2012-03-03 17:50:18 +00:00
parent 48840cc9d1
commit dc49e6143a
3 changed files with 20 additions and 5 deletions

View File

@ -41,7 +41,10 @@ class Serializer(object):
self.start_serialization() self.start_serialization()
for obj in queryset: for obj in queryset:
self.start_object(obj) self.start_object(obj)
for field in obj._meta.local_fields: # Use the concrete parent class' _meta instead of the object's _meta
# This is to avoid local_fields problems for proxy models. Refs #17717.
concrete_class = obj._meta.proxy_for_model or obj.__class__
for field in concrete_class._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:
@ -49,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 obj._meta.many_to_many: for field in concrete_class._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

@ -259,6 +259,10 @@ class ExplicitInheritBaseModel(BaseModel):
parent = models.OneToOneField(BaseModel) parent = models.OneToOneField(BaseModel)
child_data = models.IntegerField() child_data = models.IntegerField()
class ProxyBaseModel(BaseModel):
class Meta:
proxy = True
class LengthModel(models.Model): class LengthModel(models.Model):
data = models.IntegerField() data = models.IntegerField()

View File

@ -40,9 +40,9 @@ from .models import (BooleanData, CharData, DateData, DateTimeData, EmailData,
DecimalPKData, FloatPKData, IntegerPKData, IPAddressPKData, DecimalPKData, FloatPKData, IntegerPKData, IPAddressPKData,
GenericIPAddressPKData, PhonePKData, PositiveIntegerPKData, GenericIPAddressPKData, PhonePKData, PositiveIntegerPKData,
PositiveSmallIntegerPKData, SlugPKData, SmallPKData, USStatePKData, PositiveSmallIntegerPKData, SlugPKData, SmallPKData, USStatePKData,
AutoNowDateTimeData, ModifyingSaveData, InheritAbstractModel, AutoNowDateTimeData, ModifyingSaveData, InheritAbstractModel, BaseModel,
ExplicitInheritBaseModel, InheritBaseModel, BigIntegerData, LengthModel, ExplicitInheritBaseModel, InheritBaseModel, ProxyBaseModel, BigIntegerData,
Tag, ComplexModel) 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.
@ -408,6 +408,14 @@ class SerializerTests(TestCase):
for obj in serializers.deserialize("yaml", "{"): for obj in serializers.deserialize("yaml", "{"):
pass pass
def test_serialize_proxy_model(self):
BaseModel.objects.create(parent_data=1)
base_objects = BaseModel.objects.all()
proxy_objects = ProxyBaseModel.objects.all()
base_data = serializers.serialize("json", base_objects)
proxy_data = serializers.serialize("json", proxy_objects)
self.assertEqual(base_data, proxy_data.replace('proxy', ''))
def serializerTest(format, self): def serializerTest(format, self):