2011-06-03 18 views
5

यदि मेरे पास विरासत कोड से मौजूदा कक्षाएं (कुछ यूएमएल मॉडल उत्पन्न) हैं, तो Django मॉडल कक्षा के साथ उन्हें एकीकृत करने का सबसे अच्छा तरीका क्या है?Django मॉडल और विरासत वर्ग एकीकरण

मैंने अभी तक कक्षा को क्रमबद्ध करने के लिए Django कस्टम फ़ील्ड का उपयोग करने पर विचार किया है और इसे दृढ़ता से संभालने दें। (इसका नुकसान यह है कि अन्य अनुप्रयोग सीधे डेटाबेस तक पहुंचते हैं - यदि यह कभी भी आवश्यकता के लिए आया होता है - डेटा तक पहुंचने के लिए इस क्षेत्र को deserialize करना होगा।)

यदि कोई ऐसा व्यक्ति है जो कुछ सुझाव दे सकता है उपर्युक्त विकल्पों के विकल्प - इस तरह से कि मेरे मौजूदा वर्गों के आस-पास दृढ़ता को 'स्वैप आउट' किया जा सकता है, इसकी सराहना की जाएगी!

+0

तो एक डेटाबेस में धारावाहिक डेटा भंडारण, जवाब है कि आम तौर पर, आप गलत सवाल पूछ रहे हैं। ;) यह वास्तव में खराब अभ्यास है और यदि संभव हो तो इससे बचा जाना चाहिए। उस ने कहा, मैं वास्तव में समझ में नहीं आता कि आप क्या करने की कोशिश कर रहे हैं। क्या ये सीधे पाइथन कक्षाएं हैं जिन्हें आप अपने डीजेगो प्रोजेक्ट में एकीकृत करने की कोशिश कर रहे हैं? –

+0

हां वे पाइथन कक्षाएं हैं। Django के प्रलेखन [लिंक] https://docs.djangoproject.com/en/dev/howto/custom-model-fields/ [/ link] डेटाबेस से पाइथन ऑब्जेक्ट को निर्बाध रूप से स्टोर और पुनर्प्राप्त करने के लिए एक कस्टम मॉडल फ़ील्ड का उपयोग करने का सुझाव देता है।मेरा सवाल है कि जो पाइथन क्लास (यूएमएल मॉडल क्लास आरेख से उत्पन्न) लेने के लिए Django डोमेन में सर्वोत्तम अभ्यास के रूप में माना जाता है और उन वर्गों के आस-पास दृढ़ता के लिए मॉडल कक्षाओं के साथ उस कक्षा को एकीकृत करता है। उदाहरण के लिए। Django मॉडल वर्ग में अपनी सभी पद्धति डालने का एक तरीका हो सकता है, लेकिन सबसे अच्छा अभ्यास क्या है? – Michael

+0

खैर, मेरी राय में, सर्वोत्तम अभ्यास, Django को कार्यक्षमता का अनुवाद करना होगा। संक्षेप में, क्रमबद्धता आपका एकमात्र विकल्प हो सकता है, लेकिन अब एक शॉर्टकट, शायद भविष्य में और अधिक दर्द का कारण बन जाएगा। –

उत्तर

2

यदि आप लीजसी ऐप को django में स्थानांतरित करने का प्रयास कर रहे हैं, तो मैं @chrisdpratt से सहमत हूं और आपको अपनी कक्षाओं को Django मॉडल में बदलने की कोशिश करनी चाहिए। यह एक बड़े प्रयास की आवश्यकता होगी, इसलिए जब आप तैयार हैं, तो आप इस निशान का पालन कर सकते हैं:

  1. एक legacy एप्लिकेशन बना सकते हैं और वहाँ अपनी विरासत कोड डाल दिया।

    यदि आप तय करते हैं कि आपका कोड इतना महत्वपूर्ण नहीं है, और आप केवल डेटा को पकड़ना चाहते हैं, और यह एक SQL आधारित सर्वर में संग्रहीत है, तो आप "विरासत मॉडल" बनाने के लिए inspectdb का उपयोग करने का प्रयास कर सकते हैं जो आपके डेटा को पढ़ेगा अपने विरासत सर्वर से। मैं इसके लिए "विरासत" नामक एक दूसरे डीबी कनेक्शन को कॉन्फ़िगर करने का सुझाव देता हूं। देखें: https://docs.djangoproject.com/en/dev/topics/db/multi-db/

    यह सुनिश्चित करने के लिए एक कमांड लाइन टेस्ट स्क्रिप्ट बनाएं ताकि आप डेटाबेस से अपनी विरासत कक्षाएं लोड कर सकें। (कमांड लाइन से स्क्रिप्ट चलाने के लिए खोल प्रॉम्प्ट से पर्यावरण परिवर्तनीय DJANGO_SETTINGS_MODULE को सेट/निर्यात करना सुनिश्चित करें या https://docs.djangoproject.com/en/dev/ref/django-admin/?from=olddocs#running-management-commands-from-your-code देखें)।

  2. अपने नए django मॉडल को एक नए ऐप ("myapp") में बनाएं।

    वैकल्पिक रूप से, आप एक डीबी से स्वचालित रूप से मूल मॉडल प्राप्त करने के लिए inspectdb का उपयोग कर सकते हैं। हालांकि, सुनिश्चित करें कि आप मॉडलों का मानक मानक Django देखो और किसी भी अनावश्यक फ़ील्ड और विशेषताओं को महसूस और हटा दें।

  3. एक स्क्रिप्ट बनाएं जो विरासत डेटा को पढ़ती है और इसे नए मॉडल में लिखती है।

  4. पुरानी कक्षाओं से नए वर्गों में आवश्यक तर्क माइग्रेट करें।

आप चरण 3 के लिए स्क्रिप्ट के लिए एक कंकाल के रूप में उपयोग कर सकते हैं:

# legacy/management/commands/importlegacydb.py 

    from django.core.management.base import NoArgsCommand 
    import myapp.models as M 
    import legacy.models as L 

    import sys 

    write = sys.stdout.write 

    def copy_fields(old, new, mapping): 
     for old_key, new_key in mapping.items(): 
      value = getattr(old, old_key) 
      if type(value) is str: 
       value = value.strip() 
      if type(new_key) is tuple: 
       value = new_key[0](value) 
       new_key = new_key[1] 
      else: 
       if new_key == "name": 
        value = value[0].upper() + value[1:] 
      setattr(new, new_key, value) 

    def import_table(old_class, new_class, mapping): 
     write("importing %s " % old_class.__name__) 
     lookup = {} 
     l = old_class.objects.all() 
     for old in l: 
      new = new_class() 
      copy_fields(old, new, mapping) 
      new.save() 
      lookup[old.id] = new.id 
      write (".") 
     print " Done." 
     return lookup 

    class Command(NoArgsCommand): 
     help = "Import data from legacy db." 

     def handle_noargs(self, **options): 
      """ 
      Read data from legacy db to new db. 
      """ 
      print "Importing legacy data" 

      import_table(L.X, M.X, { 'old_field' : 'new_field', 'old_field2' : 'new_field2'}) 
      import_table(L.Y, M.Y, { 'old_field' : 'new_field'}) 

      print "Done." 
संबंधित मुद्दे