django中的复制对象,也复制子对象(相关对象)
我想学习如何复制对象,但也要复制引用该对象的对象 例如(简化): 型号1:版本django中的复制对象,也复制子对象(相关对象),django,django-models,Django,Django Models,我想学习如何复制对象,但也要复制引用该对象的对象 例如(简化): 型号1:版本 身份证 名字 模型2:文件 身份证 文件名 文件内容 外键指向版本 关系:一个版本可以有多个文件 因此,一个软件版本可以有多个文件。 我想复制一个完整的版本。 目前我有以下几点: def duplicate_version(request,id, MAC_address): new_version = Version.objects.get(pk=id) new_version.pk = No
- 身份证
- 名字
- 身份证
- 文件名
- 文件内容
- 外键指向版本
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)
def复制版本(请求、id、MAC地址):
new_version=version.objects.get(pk=id)
new_version.pk=无
新的_版本。保存()
new_files=File.objects.get(version_id=id)首先您可能应该阅读。get()
方法只返回一个对象。您需要的是filter()
方法来获取查询集
第二,由于您将有一个查询集,您不能只执行新建文件。version\u id=new\u id
。如果您的字段是外键,请尝试以下操作。如果是多对多,只需执行new\u version.file\u set.add(new\u files)
:
首先,你可能应该阅读。get()
方法只返回一个对象。您需要的是filter()
方法来获取查询集
第二,由于您将有一个查询集,您不能只执行新建文件。version\u id=new\u id
。如果您的字段是外键,请尝试以下操作。如果是多对多,只需执行new\u version.file\u set.add(new\u files)
:
然后使用我发布的代码中的更新方法。@Mehdi B好的,谢谢。我添加了“new_files.save()”,假设它仍然需要?queryset没有保存方法,请使用我发布的示例代码。如果使用update(),则不需要save()。同样,save用于单个对象,如get()。代码更改了新文件的外键。但它不会复制它们,然后使用我发布的代码中的更新方法。@Mehdi B好的,谢谢。我添加了“new_files.save()”,假设它仍然需要?queryset没有保存方法,请使用我发布的示例代码。如果使用update(),则不需要save()。同样,save用于单个对象,如get()。代码更改了新文件的外键。但它不会复制它们
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)
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)