Django Rest Framework ListField и DictField

у меня борьба с пониманием ListField и DictField. Я хочу использовать его как поле на сериализаторе. У меня есть 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
    )

Я знаю, это не имеет смысла, так как в документации написано DictField и ListField забрать child в качестве аргумента. И так, код выше естественно вызвал ошибку:

TypeError: _ _ init__ () получил неожиданное аргумент ключевого слова 'stops_left'

Нужный Выход

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

как этого добиться? buses список и может содержать столько элементов, сколько я хочу.


окружающая среда

  • python 3.5.1
  • 1.9.6 Джанго
  • django-rest-framework 3.3.3

1 ответов


Я думаю, вместо того, чтобы делать это, вы должны использовать вложенные сериализаторы.

создать BusSerializer с полями idn и stops_left. Затем включите этот сериализатор в свой StopOncomingSerializer as