Django rest framework 克隆多个对象并返回它们以响应DRF

Django rest framework 克隆多个对象并返回它们以响应DRF,django-rest-framework,Django Rest Framework,我的目标是克隆多个对象并序列化它们,以便可以在RESTAPI中返回结果。当前我的代码如下所示: 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_ob

我的目标是克隆多个对象并序列化它们,以便可以在RESTAPI中返回结果。当前我的代码如下所示:

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完全让步

非字段错误-无效数据。需要一本字典,但得到了MyModel


如何才能克服这一问题而不必找到肮脏的解决方法?

您之所以会遇到此错误,是因为您将模型传递给序列化程序而不是字典。 通过使用
.values()
并指定要返回的字段,可以将模型转换为字典

values()方法返回一个QuerySet,当用作iterable时,该QuerySet返回字典,而不是模型实例

例如,您当前拥有的计算结果如下

MyModel.objects.filter(...)
<QuerySet [<MyModel: Random Title>]>
如果不想将对象的id设置为“无”,该怎么办?
.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)

问题可能出在copy.deepcopy上,请尝试改用模型类本身
clone=MyModel(obj)
。如何使用类模型复制整个对象?你能提供一个代码片段吗?你基本上不需要在这里调用copy方法。您所要做的就是
obj.id=None
,当您在这个更新的对象上调用save时,它将在数据库中创建一个新条目,该条目将有一个新的
PK
,但所有剩余值将保持不变。
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)
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)