I think this happens because the survey assigned by survey_new in this line of code
survey_new = survey
Then when survey_new saved
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 became equal to survey_new . For example, you can check it like this
id(survey) # 50016784 id(survey_new) # 50016784
or the equivalent of Django
survey.id # 10 survey_new.id # 10
To find out the problem, all the necessary objects must be collected before the appointment
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
source share