簡體   English   中英

Django繼承模型的JSON序列化

[英]JSON Serialization of a Django inherited model

我有以下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)

如果有幫助,完整的模型文件就在這里

您可以看到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

這是對原始海報來說可能來得太晚的時代之一,但對於下一個Google員工可能會派上用場。

如果您需要更高級的序列化,我無法幫助您,但如果您只想要優雅地處理多表繼承,那么要查看的位置是: Serializer基類的django/core/serializers/base.py

serialize方法中有一行:

for field in concrete_model._meta.local_fields:

Monkeypatching或覆蓋該類並用以下內容替換該行:

for field in concrete_model._meta.fields:

但是有一些需要注意的注意事項,請參閱Django Git repo中的提交12716794db以及這兩個問題:

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

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

長話短說,你可能應該小心在全球范圍內這樣做,盡管根據你的目標壓倒這種行為可能會很好。

您需要一個自定義序列化程序來支持繼承字段,因為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()

也許現在已經很晚了,但是我給出了我的解決方案,以防它有用。 我使用了另一個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))

您可以指定或不指定字段列表。 我試過我的模型,它對我來說很好。 唯一的區別是,在輸出中,您將只獲得字段值,而不是模型信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM