4

次の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": ""}}]'
>>>

問題は、 Company モデルをシリアル化すると、その親オブジェクトのフィールドではなく、そのモデルに直接関連付けられたフィールドのみが得られることです。

この動作を変更する方法はありますか、それともオブジェクトの辞書を作成し、simplejson を使用して出力をフォーマットすることを検討する必要がありますか?

前もって感謝します

~sm

4

3 に答える 3

5

これは、元の投稿者にとっては答えが遅すぎるかもしれないが、次の Google 社員にとっては役立つかもしれない時期の 1 つです。

より高度なシリアライゼーションが必要な場合は、私にはお役に立てませんが、複数テーブルの継承を適切に処理するだけの場合はdjango/core/serializers/base.pySerializer基底クラスを参照してください。

serializeメソッドには次の行があります。

for field in concrete_model._meta.local_fields:

そのクラスをモンキーパッチまたはオーバーライドし、その行を次のように置き換えます。

for field in concrete_model._meta.fields:

ただし、注意すべきいくつかの警告があります。Django Git リポジトリの commit 12716794db と次の 2 つの問題を参照してください。

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

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

簡単に言うと、目標によってはその動作をオーバーライドしても問題ない場合がありますが、これをグローバルに行うことにはおそらく注意が必要です。

于 2013-01-15T15:41:03.107 に答える
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()
于 2013-02-07T14:52:35.080 に答える