2012-01-18 10 views
6

मैं एक सर्वेक्षण उदाहरण की एक पूरी प्रतिलिपि बनाने की कोशिश कर रहा हूं, जिसमें कई अनुभाग हैं, और प्रत्येक अनुभाग में कई प्रश्न हैं और अंततः प्रत्येक प्रश्न में कई विकल्प हैं। मैं MySQL के साथ मानक django 1.3.1 का उपयोग कर रहा हूँ। मुझे एक अलग सर्वेक्षण मालिक के लिए इन सभी तत्वों की पूरी प्रतिलिपि बनाने में सक्षम होना चाहिए। क्या मैं इस समय को ध्यान में रखते है:मैं 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() 

बहरहाल, यह किसी भी त्रुटि के बिना सभी छोरों के माध्यम से चलाने के लिए लगता है, और सिर्फ सर्वेक्षण की एक प्रति का निर्माण। मैं उम्मीद कर रहा था कि यह सर्वेक्षण सर्वेक्षण के लिए सर्वेक्षण, अनुभाग, प्रश्न, विकल्प की प्रतिलिपि बनाएगा। बस यह पता लगाना प्रतीत नहीं होता कि मैं यहां क्या कर रहा हूं।

+1

कुछ अवलोकन: 1. आपको ['select_related()'] (https://docs.djangoproject.com/en/1.3/ref/models/querysets/#select-related) पढ़ना चाहिए और देखें कि क्या यह है दिलचस्प लग रहा है। 2. आईडी मानों की प्रतिलिपि बनाने में बहुत सावधान रहें या आप अनजाने में डीबी में * मूल * आइटम को ओवरराइट कर सकते हैं। –

+0

आप 'Options.objects.create (...)' और 'section.objects.create (...)' आदि का उपयोग क्यों नहीं कर रहे हैं? आप पीके के साथ बेवकूफ बनने की कोशिश क्यों कर रहे हैं? –

+0

@ पीटर: चयनकर्ता के लिए सूचक के लिए धन्यवाद()। यह मेरे कोड को थोड़ा सा अनुकूलित करना चाहिए :) – Priyeshj

उत्तर

9

Googling काम से पहले एकत्र किया जाना है यह जानने के लिए "गहरी प्रतिलिपि django "इसे पहले पृष्ठ पर लौटाता है: 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() 

अगर मैं आपके सवाल का सही ढंग से समझ, आप सहेजने से पहले कुछ और क्षेत्रों को बदलना चाहते हैं जाएगा।

+7

कोई पन इरादा नहीं है लेकिन नाम नहीं होना चाहिए, "old_obj" को उचित रूप से "new_obj" कहा जा सकता है? मैं तब से देखता हूं, हम ओबीजे की एक प्रति बनाने की कोशिश कर रहे हैं और इस तरह एक नई वस्तु बना रहे हैं? बस उत्सुक। – tilaprimera

+1

@tilaprimera यह कार्यक्षमता में कोई फर्क नहीं पड़ता। इसका नाम इस तरह से रखा गया है क्योंकि 'old_obj' आईडी के अलावा, प्रतिलिपि के बिंदु पर ओबीजे के समान मान है। – Marcin

+3

बस एक नोट, यह आपके द्वारा क्लोनिंग की जा रही वस्तु के संबंधों की प्रतिलिपि नहीं करेगा। जो वांछित व्यवहार हो सकता है या नहीं भी हो सकता है, लेकिन यह मेरे लिए था, इसलिए मुझे कुछ और करने की ज़रूरत है। :) – bwest87

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

surveysurvey_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 
संबंधित मुद्दे

 संबंधित मुद्दे