2016-04-21 35 views
0

我有一个2模型。 AB。模型B有一个外键字段,以模型A,所以在实践中,A有一个B元素的列表。
我将以下数据发布到Django-REST-Framework API。Django-REST-Framework - 使用元素列表创建元素

{"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包,并在ASerializer像裹bs场所以

bs = ListField(BSerializer(many=True)) 

这创建了A对象,但未创建组合B元素。 当我改变的字段名b_set(而不是bs)我得到了以下错误:

TypeError: 'RelatedManager' object is not iterable 

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

回答

1

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

Writable Nested Serializers文档:

By default nested serializers are read-only . If you want to support write-operations to a nested serializer field you'll need to create create() and/or update() methods in order to explicitly specify how the child relationships should be saved.

0

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