Django继承模型的JSON序列化

时间:2010-05-19 13:54:37

标签: python django json jsonserializer

我有以下Django模型

class ConfigurationItem(models.Model):

    path = models.CharField('Path', max_length=1024)
    name = models.CharField('Name', max_length=1024, blank=True)
    description = models.CharField('Description', max_length=1024, blank=True)
    active = models.BooleanField('Active', default=True)
    is_leaf = models.BooleanField('Is a Leaf item', default=True)

class Location(ConfigurationItem):

    address = models.CharField(max_length=1024, blank=True)
    phoneNumber = models.CharField(max_length=255, blank=True)
    url = models.URLField(blank=True)
    read_acl = models.ManyToManyField(Group, default=None)
    write_acl = models.ManyToManyField(Group, default=None)
    alert_group= models.EmailField(blank=True)

完整的模型文件here如果有帮助的话。

您可以看到Company是ConfigurationItem的子类。

我正在尝试使用django.core.serializers.serializer或WadofStuff序列化程序来使用JSON序列化。

两个序列化程序都给我同样的问题......

>>> from cmdb.models import *
>>> from django.core import serializers
>>> serializers.serialize('json', [ ConfigurationItem.objects.get(id=7)])
    '[{"pk": 7, "model": "cmdb.configurationitem", "fields": {"is_leaf": true,    "extension_attribute_10": "", "name": "", "date_modified": "2010-05-19 14:42:53", "extension_attribute_11": false, "extension_attribute_5": "", "extension_attribute_2": "", "extension_attribute_3": "", "extension_attribute_1": "", "extension_attribute_6": "", "extension_attribute_7": "", "extension_attribute_4": "", "date_created": "2010-05-19 14:42:53", "active": true, "path": "/Locations/London", "extension_attribute_8": "", "extension_attribute_9": "", "description": ""}}]'
>>> serializers.serialize('json', [ Location.objects.get(id=7)])
    '[{"pk": 7, "model": "cmdb.location", "fields": {"write_acl": [], "url": "", "phoneNumber": "", "address": "", "read_acl": [], "alert_group": ""}}]'
>>>

问题是序列化公司模型只会给我直接与该模型相关联的字段,而不是来自其父对象的字段。

有没有办法改变这种行为,还是应该考虑构建对象字典并使用simplejson格式化输出?

提前致谢

~sm

3 个答案:

答案 0 :(得分:4)

这是其中一个回答可能来得太晚的原始海报,但对下一个Google员工来说可能会派上用场。

如果您需要更高级的序列化,我无法帮助您,但如果您只想要优雅地处理多表继承,那么要查看的位置是:django/core/serializers/base.py Serializer基类。

serialize方法中有一行:

  

for field in concrete_model._meta.local_fields:

Monkeypatching或overriding that class&用以下代码替换该行:

  

for field in concrete_model._meta.fields:

但是有一些需要注意的注意事项,请参阅Django Git repo& amp;中的提交12716794db。这两个问题:

https://code.djangoproject.com/ticket/7350

https://code.djangoproject.com/ticket/7202

长话短说,你可能应该小心在全球范围内这样做,尽管根据你的目标压倒这种行为可能会很好。

答案 1 :(得分:2)

您需要一个自定义序列化程序来支持继承字段,因为Django的序列化程序只会序列化本地字段。

我在处理这个问题时最终写了自己的东西,随意复制它: https://github.com/zmathew/django-backbone/blob/master/backbone/serializers.py

https://github.com/zmathew/django-backbone/blob/351fc75797bc3c75d2aa5c582089eb39ebb6f19a/backbone/serializers.py

为了自己使用它,您需要:

serializer = AllFieldsSerializer()
serializer.serialize(queryset, fields=fields)
print serializer.getvalue()

答案 2 :(得分:0)

也许已经很晚了,但是我给出了解决方案,以防万一。我使用了另一个实现该功能的Django库:

from django.forms.models import model_to_dict

model_to_dict(Location.objects.get(id=7), fields = ['name', 'address', 'phoneNumber'])
model_to_dict(Location.objects.get(id=7))

您可以指定或不指定字段列表。我尝试了我的模型,对我来说效果很好。唯一的区别是,在输出中,您将仅获得字段值,而不是模型信息。