2012-01-18 9 views
6

Sto cercando di creare una copia completa di un'istanza di sondaggio, che ha diverse sezioni, e ogni sezione ha diverse domande e infine ogni domanda ha diverse opzioni. Sto usando standard django 1.3.1, con MySQL. Devo essere in grado di creare una copia completa di tutti questi elementi, per un proprietario di un sondaggio diverso. Quello che ho attualmente nella vista è:Come posso creare un clone profondo di un oggetto DB in Django?

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

Tuttavia, questo sembra funzionare attraverso tutti i loop senza errori, e solo la creazione di una copia di sondaggio. Speravo che questo copiasse il sondaggio, le sezioni, le domande, le opzioni per quell'istanza del sondaggio. Proprio non riesco a capire cosa sto facendo male qui.

+1

Un paio di osservazioni: 1. Dovresti leggere ['select_related()'] (https://docs.djangoproject.com/en/1.3/ref/models/querysets/#select-related) e vedere se sembra interessante. 2. Fai molta attenzione nel copiare i valori di id o potresti sovrascrivere involontariamente l'elemento * original * nel DB. –

+0

Perché non stai usando 'Options.objects.create (...)' e 'Section.objects.create (...)' ecc.? Perché stai cercando di scherzare con i PK? –

+0

@Peter: Grazie per il puntatore a select_related(). Questo dovrebbe ottimizzare un po 'il mio codice :) – Priyeshj

risposta

9

Googling "Django copia completa "restituisce questo nella prima pagina: http://www.nerdydork.com/copy-model-object-in-django.html

Il co de campione dato è:

from copy import deepcopy 
old_obj = deepcopy(obj) 
old_obj.id = None 
old_obj.save() 

Se ho capito bene la tua domanda, vorrai cambiare qualche altro campo prima di salvare.

+7

Nessun gioco di parole, ma il nome "old_obj" non dovrebbe essere chiamato correttamente "nuovo_obj"? Vedo da allora, stiamo cercando di fare una copia di obj e quindi di creare un nuovo oggetto? Solo curioso. – tilaprimera

+1

@tilaprimera Non fa differenza per la funzionalità. È chiamato così perché 'old_obj' è, a parte l'id, valore identico a obj al punto di copiare. – Marcin

+3

Solo una nota, questo non copierà le relazioni dell'oggetto che stai clonando. Quale può o non può essere il comportamento desiderato, ma era per me, quindi ho bisogno di fare qualcos'altro. :) – bwest87

1

penso che questo accade perché survey assegnato a survey_new su questa riga di codice

survey_new = survey 

An poi quando survey_new salvati

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 diventato pari a survey_new. Per esempio è possibile controllare in modo

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

o Django equivalente

survey.id 
# 10 
survey_new.id 
# 10 

Per capire la questione tutti gli oggetti richiesti devono essere raccolti prima assegnazione

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 
Problemi correlati