web-dev-qa-db-ja.com

Django Rest Framework ListFieldおよびDictField

ListFieldDictFieldの理解に苦労しています。シリアライザのフィールドとして使いたい。 ListFieldがあり、これにはおそらく多くのDictFieldが含まれます。以下のようにシリアライザを書いてみました:

class StopOncomingSerialier(serializers.Serializer):
    idn = serializers.IntegerField(read_only=True)
    buses = serializers.ListField(
        child=serializers.DictField(
            idn=serializers.IntegerField(read_only=True),
            stops_left=serializers.IntegerField(read_only=True)
        ),
    read_only=True
    )

ドキュメントにはDictFieldListFieldchildを引数として取ると書かれているので、わかりません。したがって、上記のコードは自然にエラーを発生させました:

TypeError: __init __()が予期しないキーワード引数 'stops_left'を取得しました

望ましい出力

{
    "idn": 1,
    "buses": [
        {"idn": 11, "stops_left": 4},
        {"idn": 12, "stops_left": 15}
    ]
}

これを達成する方法は? busesはリストであり、必要な数の要素を含めることができます。


環境

  • python 3.5.1
  • Django 1.9.6
  • Django-rest-framework 3.3.3
15
Erdin Eray

そうする代わりに、ネストされたシリアライザを使用をすべきだと思います。

フィールドBusSerializerおよびstops_leftを持つidnを作成します。次に、このシリアライザをStopOncomingSerializerとしてbusesフィールドとしてmany=True引数とともに含め、複数のbusesデータを処理します。

class BusSerializer(serializers.Serializer):
    idn = serializers.IntegerField(read_only=True)
    stops_left = serializers.IntegerField(read_only=True)


class StopOncomingSerialier(serializers.Serializer):
    idn = serializers.IntegerField(read_only=True)
    buses = BusSerializer(many=True)
21
Rahul Gupta