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

时间:2012-01-18 21:50:30

标签: 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()

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

2 个答案:

答案 0 :(得分: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()

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

答案 1 :(得分:1)

我认为这是因为survey在此代码行上分配给survey_new

survey_new = survey

然后survey_new保存

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()

survey等于survey_new。例如,你可以检查它

id(survey)
# 50016784
id(survey_new)
# 50016784

或Django等效

survey.id
# 10
survey_new.id
# 10

要弄清楚问题,必须在分配前收集所有必需的对象

survey_section = survey.sections.all().order_by('order')
# ... all other questions and options 

survey_new = survey
survey_new.title = survey.title + ' -- Copy'
survey_new.owner = str(new_owner_id)
# ... your remaining code