10

私はdjangoにまったく慣れていませんが、最近、次のdjangoコードを使用するJSON出力が必要です。

data = serializers.serialize("json", Mymodel.objects.all())

次の出力が得られることを除いて、うまく機能します。

[{"pk": 8970859016715811, "model": "myapp.mymodel", "fields": {"reviews": "3.5", "title": .....}}]

ただし、出力を単純に次のいずれかにしたいと思います。

[{"reviews": "3.5", "title": .....}]

また、

[{"id": "8970859016715811", "reviews": "3.5", "title": .....}]

これを達成する方法について、誰かが私を正しい方向に向けることができるかどうか疑問に思っていました。

4

4 に答える 4

7

次のように、「fields」パラメーターを serialize-function に追加できます。

data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size'))

参照: https://docs.djangoproject.com/en/dev/topics/serialization/

編集1:

シリアライザをカスタマイズして、指定したフィールドのみを取得できます。

Override Django Object Serializerから、指定されたモデルを取り除きます:

from django.core.serializers.python import Serializer

class MySerialiser(Serializer):
    def end_object( self, obj ):
        self._current['id'] = obj._get_pk_val()
        self.objects.append( self._current )

 # views.py
 serializer = MySerialiser()
 data = serializer.serialize(some_qs)
于 2013-03-16T18:41:19.973 に答える
4

カスタム Json シリアライザーを作成する必要があります。このような何かがうまくいくはずです:

class FlatJsonSerializer(Serializer):
    def get_dump_object(self, obj):
        data = self._current
        if not self.selected_fields or 'id' in self.selected_fields:
            data['id'] = obj.id
        return data

    def end_object(self, obj):
        if not self.first:
            self.stream.write(', ')
        json.dump(self.get_dump_object(obj), self.stream,
                  cls=DjangoJSONEncoder)
        self._current = None

    def start_serialization(self):
        self.stream.write("[")

    def end_serialization(self):
        self.stream.write("]")

    def getvalue(self):
        return super(Serializer, self).getvalue()

次のように使用できます。

s = FlatJsonSerializer()
s.serialize(MyModel.objects.all())

または、シリアライザーを登録してdjango.core.serializers.register_serializerから、使い慣れたserializers.serializeショートカットを使用することもできます。

さらにカスタマイズが必要な場合は、参考として django の実装をご覧ください: https://github.com/django/django/blob/master/django/core/serializers/json.py#L21-62

于 2013-11-05T19:39:08.830 に答える
2

私は同じ問題を抱えていたので、これに出くわしました。また、カスタムシリアライザーでこれを解決し、「EDIT 1」メソッドを試しましたが、django JSONエンコーダーがすでに行ったすべての機能(10進数、日付のシリアル化)をすべて取り除いたため、うまく機能しませんでした。これを書き換えることができますあなた自身がなぜわざわざ。このようにJSONシリアライザーを直接継承することは、邪魔にならない方法だと思います。

from django.core.serializers.json import Serializer
from django.utils.encoding import smart_text    

class MyModelSerializer(Serializer):
    def get_dump_object(self, obj):
        self._current['id'] = smart_text(obj._get_pk_val(), strings_only=True)
        return self._current

フィールドとモデルを書き込む主な原因は、親レベルの python シリアライザーにあり、このようにして、django の JSON シリアライザーに既に組み込まれているフィールド フィルタリングも自動的に取得します。このように呼びます

serializer = MyModelSerializer()
data = serializer.serialize(<queryset>, <optional>fields=('field1', 'field2'))
于 2013-11-24T02:46:05.890 に答える