django中的重复对象,也是重复的子对象(相关对象)

时间:2018-05-20 20:51:13

标签: django django-models

我想学习如何复制对象,还要复制引用该对象的对象。

作为一个例子(简化): 模型1:版本

  • ID
  • 名称

模型2:文件

  • ID
  • 文件名
  • 文件内容
  • 指向版本的外键

关系:一个版本可以有多个文件

所以一个软件版本可以有多个文件。 我想复制一个完整的版本。 目前我有以下内容:

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!

2 个答案:

答案 0 :(得分:2)

首先你应该阅读thisget()方法只返回一个对象。您需要的是获取查询集的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)