2016-04-21 58 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提供的解決方案。