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:
parent
48840cc9d1
commit
dc49e6143a
|
@ -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):
|
||||
|
||||
|
|
Loading…
Reference in New Issue