如果我從傳統代碼中生成現有類(由某些UML模型生成),將它們與Django 模型類集成的最佳方法是什麼?Django模型和傳統類集成
我到目前爲止考慮使用Django自定義字段來序列化類並讓它處理持久性。 (這是其他應用程序直接訪問數據庫的缺點 - 如果它曾經來,作爲一個要求 - 必須反序列化,以訪問數據這個領域。)
如果有任何人可以提出一些上述替代方案 - 以一種方式,我現有的類的持久性可以'換出',這將不勝感激!
如果我從傳統代碼中生成現有類(由某些UML模型生成),將它們與Django 模型類集成的最佳方法是什麼?Django模型和傳統類集成
我到目前爲止考慮使用Django自定義字段來序列化類並讓它處理持久性。 (這是其他應用程序直接訪問數據庫的缺點 - 如果它曾經來,作爲一個要求 - 必須反序列化,以訪問數據這個領域。)
如果有任何人可以提出一些上述替代方案 - 以一種方式,我現有的類的持久性可以'換出',這將不勝感激!
如果您正試圖將遺留應用程序遷移到django,我同意@chrisdpratt,並且應該嘗試將您的類轉換爲Django模型。這將需要大量的努力,所以當你準備好了,你可以按照這個線索:
創建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)。
在一個新的應用程序( 「myapp
」)創建新的Django模型。
或者,您可以再次使用inspectdb從數據庫中自動獲取基本模型。但是,請確保將模型重命名爲標準Django外觀,並刪除任何不必要的字段和屬性。
創建一個腳本,讀取舊數據,並將其寫入新車型。
將所需的邏輯從舊類遷移到新類。
您可以使用此作爲腳本的骨架步驟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."
如果在數據庫中存儲序列化的數據是答案,通常,你問錯了問題。 ;)這是非常糟糕的做法,應儘可能避免。這就是說,我不明白你想做什麼。這些直接的python類是你想要集成到你的Django項目中的嗎? – 2011-06-03 14:44:36
是的,他們是Python類。 Django的文檔[鏈接] https://docs.djangoproject.com/en/dev/howto/custom-model-fields/ [/鏈接]建議使用自定義模型領域無縫存儲和檢索數據庫中的Python對象。我的問題是在Django領域採用Python類(從UML模型類圖中生成)並將該類與模型類集成在一起以保持這些類的最佳實踐。例如。將所有的方法都放在Django模型類中可能是一種方法,但最佳實踐是什麼? – Michael 2011-06-03 15:15:07
嗯,在我看來,最佳實踐是將功能轉換爲Django。除此之外,序列化可能是您唯一的選擇,但現在快捷方式,可能會導致未來更多的痛苦。 – 2011-06-03 15:17:53