django-rest-framework - 克隆多个对象并将它们返回以响应 DRF
问题描述
我的目标是克隆多个对象并将它们序列化,以便我可以在我的 REST Api 中返回结果。目前我的代码如下所示:
objects_to_clone = MyModel.objects.filter(...)
new_objects = []
for obj in objects_to_clone:
clone = copy.deepcopy(file)
clone.id = None
# Do something else with the cloned object
new_objects.append(clone)
serializer = MySerializer(data=new_objects, many=True) # YIELDS ERROR
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
这段代码的问题是 Django 公正地产生
nonFieldErrors - 无效数据。需要一本字典,但得到了 MyModel
如何在不必寻找肮脏的解决方法的情况下克服这个问题?
解决方案
您收到该错误是因为您将模型传递给序列化程序而不是字典。.values()
您可以通过使用并指定要返回的字段将模型转换为字典。
values() 方法返回一个 QuerySet,它在用作可迭代对象时返回字典而不是模型实例。
例如,您当前拥有的评估结果是这样的
MyModel.objects.filter(...)
<QuerySet [<MyModel: Random Title>]>
但如果你使用values,相同查询的结果将是
MyModel.objects.filter(...).values()
<QuerySet [{'id': 1, 'name': 'Model 1'}, {'id': 2, 'name': 'Model 2'}]>
归根结底,您的代码将是这样的
objects_to_clone = MyModel.objects.filter(...).values()
new_objects = []
for obj in objects_to_clone:
obj.id = None
# Do something else with the cloned object
new_objects.append(obj)
serializer = MySerializer(data=new_objects, many=True) # YIELDS ERROR
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
如果您不想将对象的 id 设置为 None 怎么办?该.values
方法允许您指定所需模型的字段
所以更直接的代码修改版本将是
objects_to_clone = MyModel.objects.filter(...).values('name', 'description') # fake info of course
serializer = MySerializer(data=objects_to_clone, many=True) # YIELDS ERROR
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
推荐阅读
- regex - 如何修复“正则表达式中未转义的左大括号在正则表达式中是非法的”错误?
- coq - Coq:一元到二进制的转换
- node.js - 部署的 Nodejs 服务在 Azure Web App 上不起作用
- r - 当我将标签添加到 geom_bar 时,如何阻止图形发生变化?
- selenium - 无头镀铬慢启动
- python - python中是否有换行符,就像
HTML中有a - amazon-web-services - 有没有办法暂时停止 AWS Kinesis Stream?
- arrays - 将表示二进制数的整数数组转换为十进制数
- android - 多行 React-Native Text 组件的宽度不会调整为 Android 上最长文本行的长度
- web-scraping - 如何使用 Puppeteer Sharp 从 h1 标签中获取文本?