Django-REST-Framework - 使用元素列表创建元素

时间:2016-04-21 14:32:42

标签: python django rest django-rest-framework

我有2个型号。 AB。模型B有一个ForeignKey字段来建模A所以在实践中,A有一个B元素列表。
我将以下数据发布到Django-REST-Framework api。

{"a_field_1": "value1", "bs": [{"b_field_1": "value1", "b_field_2": "value2"}]}

这些是我的序列化程序:

class BSerializer(serializers.ModelSerializer):

    class Meta:
        model = B
        fields = ('b_field_1', 'b_field_2')


class ASerializer(serializers.ModelSerializer):

    bs = BSerializer(many=True)

    class Meta:
        model = A
        fields = ('a_field_1', 'bs')

当我发布到我的API时,我收到此错误:

The `.create()` method does not support writable nestedfields by default.
Write an explicit `.create()` method for serializer `app.serializers.ASerializer`, or set `read_only=True` on nested serializer fields.

我找到了drf_compound_fields个包并将bs字段包装在ASerializer中,就像这样

bs = ListField(BSerializer(many=True))

这创建了A对象但没有创建复合B元素。 当我将字段名称更改为b_set(而不是bs)时,我收到以下错误:

TypeError: 'RelatedManager' object is not iterable

使用复合元素列表序列化和创建单个元素的正确方法是什么。

2 个答案:

答案 0 :(得分:1)

如果您还要创建create对象,则需要覆盖B方法。

来自Writable Nested Serializers的文档:

  

默认情况下,嵌套序列化程序为read-only。如果要支持对嵌套序列化程序字段的写操作,则需要创建create()和/或update()方法,以便明确指定应如何保存子关系。

答案 1 :(得分:0)

如果您已使用ListField,则可能不需要many=True kwarg。 但是你应该看看AKS提供的解决方案。