我正在尝试创建一个包含多个部分的调查实例的完整副本,每个部分都有几个问题,最后每个问题都有几个选项。我正在使用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()
然而,这似乎贯穿所有循环而没有任何错误,只是创建一个调查副本。我希望这会复制该调查实例的调查,部分,问题和选项。似乎无法弄清楚我在这里做错了什么。
答案 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