我想学习如何复制对象,还要复制引用该对象的对象。
作为一个例子(简化): 模型1:版本
模型2:文件
关系:一个版本可以有多个文件
所以一个软件版本可以有多个文件。 我想复制一个完整的版本。 目前我有以下内容:
def duplicate_version(request,id, MAC_address):
new_version = Version.objects.get(pk=id)
new_version.pk = None
new_version.save()
new_files = File.objects.get(version_id=id) <-- here I get the error
new_id = new_version.id
new_files.version_id = new_id
new_files.save()
return get_all_versions(request, MAC_address)
我理解如何复制对象并更改id(= None)。 但是如何设法复制所有相关文件?
我得到的错误: 异常值: get()返回多个文件 - 它返回2!
答案 0 :(得分:2)
首先你应该阅读this。 get()
方法只返回一个对象。您需要的是获取查询集的filter()
方法。
其次,因为你将拥有一个查询集,你不能只做new_files.version_id = new_id
。如果您的字段是外键,请尝试以下操作。如果是多对多,只需new_version.file_set.add(new_files)
:
def duplicate_version(request,id, MAC_address):
new_version = Version.objects.get(pk=id)
new_version.pk = None
new_version = new_version.save()
new_files = File.objects.filter(version_id=id)
new_files.update(version_id=new_version.id)
return get_all_versions(request, MAC_address)
答案 1 :(得分:1)
def duplicate_version(request, pk, MAC_address):
new_version = Version.objects.get(pk=pk)
new_version.pk = None
new_version.modification_date = datetime.datetime.now()
new_version.save()
new_files = File.objects.filter(version_id=pk)
for file in new_files:
file.version_id = new_version.pk
file.pk = None
file.save()
return get_all_versions(request, MAC_address)