2012-01-18 13 views
6

いくつかのセクションを持つ調査インスタンスの完全なコピーを作成しようとしています。各セクションにいくつかの質問があり、最終的にそれぞれの質問にはいくつかのオプションがあります。私は標準のdjango 1.3.1をMySQLと共に使用しています。私は、別の調査所有者のために、これらすべての要素の完全なコピーを作成できる必要があります。私は、現在のビューを持っていることである。DjangoでDBオブジェクトの深いクローンを作成するにはどうしたらいいですか?

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

しかし、これはエラーなしですべてのループを介して実行するようで、ちょうど調査のコピーを作成します。私はこれが調査、セクション、質問、その調査インスタンスのオプションをコピーすることを望んでいました。私がここで間違っていることを理解できないように見えるだけです。 surveyコード

survey_new = survey 

のこの行にsurvey_newに割り当てられているため

+1

いくつかの観察:1.あなたは['select_related()'](https://docs.djangoproject.com/en/1.3/ref/models/querysets/#select-related)を読んで、興味深いね。 2. id値のコピーに注意してください。または、意図せずDBの*元の項目を上書きすることがあります。 –

+0

なぜ 'Options.objects.create(...)'や 'Section.objects.create(...)'などを使っていないのですか?どうしてあなたはPKのことをばかにするのですか? –

+0

@Peter:select_related()へのポインタありがとう。それは私のコードを少し最適化する必要があります:) – Priyeshj

答えて

9

前に収集する必要がある問題を把握するためにチェックすることができます"これを最初のページに返します。http://www.nerdydork.com/copy-model-object-in-django.html

サンプルは以下の通りです:

私があなたの質問を正しく理解していれば、保存する前にいくつかのフィールドを変更することをお勧めします。

+7

名前は意図していませんが、「old_obj」は「new_obj」という名前ではありませんか?それ以来、objのコピーを作成して新しいオブジェクトを作成しようとしています。ちょっと興味があるんだけど。 – tilaprimera

+1

@tilaprimeraそれは機能に違いはありません。 'old_obj'は、idとは別に、コピーの時点でobjと同じ値であるため、このように指定されています。 – Marcin

+3

ちょうどメモ、これはあなたが複製しているオブジェクトの関係をコピーしません。それは望ましい行動であるかもしれないし、そうでないかもしれないが、それは私のためのものなので、何か他のことをする必要がある。 :) – bwest87

1

私はこの問題が発生したと思わAnが、その後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 

またはジャンゴ同等

survey.id 
# 10 
survey_new.id 
# 10 

必要なすべてのオブジェクトは、「深いコピーをDjangoのグーグルで割り当て

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 
関連する問題