2011-06-03 38 views
5

如果我從傳統代碼中生成現有類(由某些UML模型生成),將它們與Django 模型類集成的最佳方法是什麼?Django模型和傳統類集成

我到目前爲止考慮使用Django自定義字段來序列化類並讓它處理持久性。 (這是其他應用程序直接訪問數據庫的缺點 - 如果它曾經來,作爲一個要求 - 必須反序列化,以訪問數據這個領域。)

如果有任何人可以提出一些上述替代方案 - 以一種方式,我現有的類的持久性可以'換出',這將不勝感激!

+0

如果在數據庫中存儲序列化的數據是答案,通常,你問錯了問題。 ;)這是非常糟糕的做法,應儘可能避免。這就是說,我不明白你想做什麼。這些直接的python類是你想要集成到你的Django項目中的嗎? – 2011-06-03 14:44:36

+0

是的,他們是Python類。 Django的文檔[鏈接] https://docs.djangoproject.com/en/dev/howto/custom-model-fields/ [/鏈接]建議使用自定義模型領域無縫存儲和檢索數據庫中的Python對象。我的問題是在Django領域採用Python類(從UML模型類圖中生成)並將該類與模型類集成在一起以保持這些類的最佳實踐。例如。將所有的方法都放在Django模型類中可能是一種方法,但最佳實踐是什麼? – Michael 2011-06-03 15:15:07

+0

嗯,在我看來,最佳實踐是將功能轉換爲Django。除此之外,序列化可能是您唯一的選擇,但現在快捷方式,可能會導致未來更多的痛苦。 – 2011-06-03 15:17:53

回答

2

如果您正試圖將遺留應用程序遷移到django,我同意@chrisdpratt,並且應該嘗試將您的類轉換爲Django模型。這將需要大量的努力,所以當你準備好了,你可以按照這個線索:

  1. 創建legacy應用程序,並把你的遺留代碼那裏。

    如果你決定你的代碼是不是那麼重要,只是想和你來獲取數據,並存儲在基於SQL Server,你可以嘗試使用inspectdb打造「傳統模式」,將讀取你的數據從您的舊服務器。我建議爲此配置第二個名爲「legacy」的數據庫連接。請參閱:https://docs.djangoproject.com/en/dev/topics/db/multi-db/

    創建一個命令行測試腳本,以確保可以從數據庫加載舊類。 (確保從shell提示符設置/導出環境變量DJANGO_SETTINGS_MODULE以從命令行運行腳本或參見https://docs.djangoproject.com/en/dev/ref/django-admin/?from=olddocs#running-management-commands-from-your-code)。

  2. 在一個新的應用程序( 「myapp」)創建新的Django模型。

    或者,您可以再次使用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."