Django继承模型的序列化
我在处理Django继承模型的序列化时遇到了问题。比如说:
class Animal(models.Model):
color = models.CharField(max_length=50)
class Dog(Animal):
name = models.CharField(max_length=50)
...
# now I want to serialize Dog model with Animal inherited fields obviously included
print serializers.serialize('xml', Dog.objects.all())
结果只有Dog模型被序列化了。
我可以这样做:
all_objects = list(Animal.objects.all()) + list(Dog.objects.all())
print serializers.serialize('xml', all_objects)
但是这样看起来很糟糕,而且我的模型非常庞大,所以我必须使用SAX解析器,而这样的输出让解析变得很困难。
有没有什么办法可以序列化带有父类的Django模型呢?
**补充说明:** 在这个补丁应用之前,这个功能是正常的。补丁存在的原因是“模型保存时在反序列化过程中过于积极地创建新的父类实例。现在对模型的原始保存会跳过父类的保存。”我认为应该有一个选项,可以默认只序列化“本地字段”,还有第二个选项 - “全部” - 用于序列化所有继承的字段。
5 个回答
0
你有没有看过 select_related()
呢?
serializers.serialize('xml', Dog.objects.select_related().all())
1
你需要一个自定义的序列化器来支持继承的字段,因为Django的序列化器只会处理本地字段。
我在遇到这个问题时写了自己的序列化器,欢迎你复制使用:https://github.com/zmathew/django-backbone/blob/master/backbone/serializers.py
如果你想单独使用它,你需要这样做:
serializer = AllFieldsSerializer()
serializer.serialize(queryset, fields=fields)
print serializer.getvalue()
1
你在补丁的文档里找到了答案。
all_objects = list(Animal.objects.all()) + list(Dog.objects.all())
print serializers.serialize('xml', all_objects)
不过,如果你把 Animal
改成一个抽象基类,这样就可以正常工作了:
class Animal(models.Model):
color = models.CharField(max_length=50)
class Meta:
abstract = True
class Dog(Animal):
name = models.CharField(max_length=50)
从 Django 1.0 开始,这样做是可以的。你可以查看这个链接了解更多信息:http://docs.djangoproject.com/en/dev/topics/db/models/。