django - Django Rest Framework 创建多个对象
问题描述
这就是我到目前为止所拥有的。
我的序列化器:
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
在序列化程序实例上就足以完成此任务,但我无法从请求中获取数据。
我错过了任何步骤或其他解决方法?
编辑
忘了说两件事
- 我正在使用django rest framework json api库,这可能是数据为空的原因吗?
- 因为我正在测试端点并且我在发送数据时使用 json.dumps(payload) ,所以我放置了字典。
解决方案
好的,我对创建单个对象实例的工作感到惊讶,因为数据似乎格式不正确。使用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"
}
]
这些是这里需要注意的点:
- JSON 以列表开头
- 字段直接在每个对象的主体中 - 没有
type
或attribute
字段,希望您实现逻辑以在序列化程序中解析它 - JSON 不使用单引号,而是使用双引号
您是否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 中查看此评论
推荐阅读
- javascript - 如何在 Pixijs 中调整图形形状的大小(使用顶点指针),类似于我们在绘画或文字应用程序中所做的?
- flutter - Flutter应用中如何处理降噪
- go - 任务队列任务未在开发服务器中执行
- flutter - 具有多个滚动视图的 Flutter slip_up_panel 都在面板中使用相同的 scrollController
- python-3.x - Python await 未完成但已跳过
- google-translate - 带有词汇表的 Google Translation API Advanced 将 HTML 符号“<”和“>”添加到某些单词
- android - 如何为 Jetpack Compose 做出贡献?
- php - 并非所有序列化数据都在输出
- c# - 获取无法到达的地址发送 UDP 消息
- java - Spring boot TopicRecordNameStrategy 使用消费者读取与其相关的记录类型