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()
|
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)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue