如何在Django中创建DB对象的深层克隆?

Pri*_*shj 10 mysql django deep-copy

我正在尝试创建一个包含多个部分的调查实例的完整副本,每个部分都有几个问题,最后每个问题都有几个选项.我正在使用MySQL的标准django 1.3.1.我需要能够为不同的调查所有者创建所有这些元素的完整副本.我目前在视图中看到的是:

    survey_new = survey
    survey_new.title = survey.title + ' -- Copy'
    survey_new.owner = str(new_owner_id)
    survey_new.created = datetime.now()
    survey_new.pk = None
    survey_new.save()

    for sec in survey.sections.all().order_by('order'):
        sec_n = sec
        sec_n.survey_id = survey_new.id 
        sec_n.pk = None
        sec_n.save()

        for q in sec.questions.all().order_by('order'):
            q_n = q
            q_n.section_id = sec_n.id
            q_n.pk = None
            q_n.save()

            for op in q.options.all().order_by('order'):
                op_n = op
                op_n.question_id = q_n.id
                op_n.pk = None
                op_n.save()
Run Code Online (Sandbox Code Playgroud)

但是,这似乎贯穿所有循环而没有任何错误,只是创建一个调查副本.我希望这会复制该调查实例的调查,部分,问题和选项.似乎无法弄清楚我在这里做错了什么.

Mar*_*cin 12

谷歌搜索"django deep copy"在第一页上返回:http://www.nerdydork.com/copy-model-object-in-django.html

给出的代码示例是:

from copy import deepcopy
old_obj = deepcopy(obj)
old_obj.id = None
old_obj.save()
Run Code Online (Sandbox Code Playgroud)

如果我正确理解您的问题,您需要在保存之前更改一些字段.

  • 没有双关语,但不应该名称,"old_obj"被恰当地称为"new_obj"而不是?我知道,从那时起,我们正在尝试制作obj的副本,从而制作一个新对象?只是好奇. (11认同)
  • 只是注意,这不会复制您正在克隆的对象的关系.这可能是也可能不是所期望的行为,但它适合我,所以我需要做一些其他事情.:) (4认同)
  • @ bwest87:这个答案的方法实际上复制了模型中声明的ForeignKey和OneToOneField属性,该实例被复制,但不是ManyToMany,或者反过来引用它. (2认同)