我有2个型号。 A
和B
。模型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
使用复合元素列表序列化和创建单个元素的正确方法是什么。
答案 0 :(得分:1)
如果您还要创建create
对象,则需要覆盖B
方法。
来自Writable Nested Serializers的文档:
默认情况下,嵌套序列化程序为
read-only
。如果要支持对嵌套序列化程序字段的写操作,则需要创建create()
和/或update()
方法,以便明确指定应如何保存子关系。
答案 1 :(得分:0)
如果您已使用ListField,则可能不需要many=True
kwarg。
但是你应该看看AKS提供的解决方案。