代码之家  ›  专栏  ›  技术社区  ›  peter

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

  •  1
  • peter  · 技术社区  · 7 年前

    我想学习如何复制一个对象,但也要复制引用该对象的对象。

    例如(简化): 型号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(=无)。 但是我如何才能复制所有相关的文件呢?

    我得到的错误: 异常值: get()返回了多个文件——返回了2个!

    2 回复  |  直到 7 年前
        1
  •  2
  •   May.D    7 年前

    首先你应该读 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)
    
        2
  •  1
  •   Maxim Kukhtenkov    7 年前
    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)
    
    推荐文章