Kaydet (Commit) dc49e614 authored tarafından Jannis Leidel's avatar Jannis Leidel

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
üst 48840cc9
......@@ -41,7 +41,10 @@ class Serializer(object):
self.start_serialization()
for obj in queryset:
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.rel is None:
if self.selected_fields is None or field.attname in self.selected_fields:
......@@ -49,7 +52,7 @@ class Serializer(object):
else:
if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
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 self.selected_fields is None or field.attname in self.selected_fields:
self.handle_m2m_field(obj, field)
......
......@@ -259,6 +259,10 @@ class ExplicitInheritBaseModel(BaseModel):
parent = models.OneToOneField(BaseModel)
child_data = models.IntegerField()
class ProxyBaseModel(BaseModel):
class Meta:
proxy = True
class LengthModel(models.Model):
data = models.IntegerField()
......
......@@ -40,9 +40,9 @@ from .models import (BooleanData, CharData, DateData, DateTimeData, EmailData,
DecimalPKData, FloatPKData, IntegerPKData, IPAddressPKData,
GenericIPAddressPKData, PhonePKData, PositiveIntegerPKData,
PositiveSmallIntegerPKData, SlugPKData, SmallPKData, USStatePKData,
AutoNowDateTimeData, ModifyingSaveData, InheritAbstractModel,
ExplicitInheritBaseModel, InheritBaseModel, BigIntegerData, LengthModel,
Tag, ComplexModel)
AutoNowDateTimeData, ModifyingSaveData, InheritAbstractModel, BaseModel,
ExplicitInheritBaseModel, InheritBaseModel, ProxyBaseModel, BigIntegerData,
LengthModel, Tag, ComplexModel)
# A set of functions that can be used to recreate
# test data objects of various kinds.
......@@ -408,6 +408,14 @@ class SerializerTests(TestCase):
for obj in serializers.deserialize("yaml", "{"):
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):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment