[英]create multiple objects using writable nested serializers in django rest framework 3
[英]Django Rest Framework create multiple objects
這是我到目前為止。
我的序列化器:
class MySerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ('field_1', 'field_2', 'field_3')
我的模型視圖集
class MyViewSet(ModelViewSet):
serializer_class = MySerializer
model = MyModel
queryset = MyModel.objects.all().order_by('date_paid')
def create(self, request, *args, **kwargs):
many = True if isinstance(request.data, list) else False
serializer = MySerializer(data=request.data, many=many)
if serializer.is_valid():
serializer.save()
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.data, status=status.HTTP_201_CREATED)
我主要擔心的是,在測試端點以使用以下有效負載創建多個對象時,在視圖上,屬性request.data
似乎為空,因此它返回缺少字段的錯誤。
{
'data': [
{
'type': 'MySerializer',
'attributes': {
'field_1': 1,
'field_2': 0.05,
'field_3': 'abc'
}
},
{
'type': 'MySerializer',
'attributes': {
'field_1': 1,
'field_2': 0.05,
'field_3': 'abc'
}
},
{
'type': 'MySerializer',
'attributes': {
'field_1': 1,
'field_2': 0.05,
'field_3': 'abc'
}
}
]
}
但是,當使用單個對象實例時:
{
'data': {
'type': 'MySerializer',
'attributes': {
'field_1': 1,
'field_2': 0.05,
'field_3': 'abc'
}
}
}
它似乎工作得很好,並且創建了對象。
我嘗試了幾種方法來容納有效載荷:
attributes
字段內。data
字段上,但它返回對象錯誤或空request.data
我應該如何發送多個對象的數據,是否有可能,我在很多文章中都讀到過,只需在序列化程序實例上放置many=True
就足以完成此任務,但我無法從要求。
我錯過的任何步驟或其他解決方法?
編輯
忘了說兩件事
好的,我實際上很驚訝單個對象實例的創建有效,因為數據的格式似乎不正確。 當使用many
參數時,序列化程序需要一個列表,但您發送的是一個 json 對象。
這是 JSON 應該是這樣的:
[
{
"field_1": 1,
"field_2": 0.05,
"field_3': "abc"
},
{
"field_1": 1,
"field_2": 0.05,
"field_3': "abc"
},
{
"field_1": 1,
"field_2": 0.05,
"field_3': "abc"
}
]
這些是這里需要注意的點:
type
或attribute
字段,期望您實現邏輯以在序列化程序中解析它您是否檢查request.data
以確認它是空的? 如果是這樣,那么這完全是另一個問題,因為它可能是解析問題。
編輯:使用 JSON API
在Rest framework json api github page稍微挖掘后,我發現這個問題要求支持批量操作。 顯然,他們在此拉取請求中添加了它,您可以在評論中看到多個對象的正確格式。
你的應該是這樣的:
{
"data": [
{
"type": "MySerializer",
"attributes": {
"field_1": 1,
"field_2": 0.05,
"field_3": "abc"
}
},
{
"type": "MySerializer",
"attributes": {
"field_1": 1,
"field_2": 0.05,
"field_3": "abc"
}
},
{
"type": "MySerializer",
"attributes": {
"field_1": 1,
"field_2": 0.05,
"field_3": "abc"
}
}
]
}
解析器很可能無法以您提供的格式解析數據,這就是您的request.data
為空的原因。
編輯2:
雖然批量操作功能尚未集成到 json-api 規范中,但 Django Rest JSON-API 已經為其添加了一個特殊的解析器。 因此,您必須添加此解析器JSONAPIBulkParser
才能使其工作。 在 PR 中查看此評論
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.