Estoy tratando de crear una copia completa de una instancia de encuesta, que tiene varias secciones, y cada sección tiene varias preguntas y, finalmente, cada pregunta tiene varias opciones. Estoy usando el estándar django 1.3.1, con MySQL. Necesito poder crear una copia completa de todos estos elementos para un propietario de encuesta diferente. Lo que tengo actualmente en la vista es:¿Cómo puedo crear un clon profundo de un objeto DB en 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()
Sin embargo, esto parece correr a través de todos los bucles sin ningún error, y sólo la creación de una copia de la encuesta. Esperaba que esto copiara la encuesta, las secciones, las preguntas y las opciones para esa instancia de encuesta. Simplemente no puedo entender lo que estoy haciendo mal aquí.
Un par de observaciones: 1. Debería leer ['select_related()'] (https://docs.djangoproject.com/en/1.3/ref/models/querysets/#select-related) y ver si parece interesante. 2. Tenga mucho cuidado al copiar los valores de id o puede sobrescribir involuntariamente el elemento * original * en el DB. –
¿Por qué no usa 'Options.objects.create (...)' y 'Section.objects.create (...)' etc.? ¿Por qué estás tratando de jugar con los PK? –
@ Peter: Gracias por el puntero a select_related(). Eso debería optimizar un poco mi código :) – Priyeshj