Python Django模型和遗留类集成
如果我有从遗留代码生成的现有类(由一些UML模型生成),那么将它们与Django模型类集成的最佳方法是什么 到目前为止,我已经考虑过使用Django自定义字段来序列化类,并让它处理持久性。(这样做的缺点是,其他直接访问数据库的应用程序(如果需要的话)必须反序列化此字段才能访问数据。)Python Django模型和遗留类集成,python,database,django,django-models,Python,Database,Django,Django Models,如果我有从遗留代码生成的现有类(由一些UML模型生成),那么将它们与Django模型类集成的最佳方法是什么 到目前为止,我已经考虑过使用Django自定义字段来序列化类,并让它处理持久性。(这样做的缺点是,其他直接访问数据库的应用程序(如果需要的话)必须反序列化此字段才能访问数据。) 如果有任何人可以建议上述方法的一些替代方案——在某种程度上,我的现有类周围的持久性可以被“替换掉”,那将不胜感激 如果您试图将遗留应用程序移动到django,我同意@chrisdpratt,您应该尝试将您的类转换为
如果有任何人可以建议上述方法的一些替代方案——在某种程度上,我的现有类周围的持久性可以被“替换掉”,那将不胜感激 如果您试图将遗留应用程序移动到django,我同意@chrisdpratt,您应该尝试将您的类转换为django模型。这将需要很大的努力,因此当您准备好时,您可以遵循以下路径:
legacy
应用程序,并将您的legacy代码放在那里。
如果您认为代码不太重要,只想获取数据,并且数据存储在基于SQL的服务器中,那么可以尝试使用创建“遗留模型”,从遗留服务器读取数据。我建议为此配置第二个名为“legacy”的DB连接。见:
创建命令行测试脚本以确保可以从数据库加载旧类。(请确保从shell提示符设置/导出环境变量DJANGO_SETTINGS_MODULE,以从命令行运行脚本,或参见)myapp
”)
或者,您可以再次使用从数据库自动获取基本模型。但是,请确保将模型重命名为标准Django外观,并删除任何不必要的字段和属性 # 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."
如果将序列化数据存储在数据库中是答案,那么通常情况下,您提出的问题是错误的这是非常糟糕的做法,应该尽可能避免。也就是说,我真的不明白你想做什么。这些是您试图集成到Django项目中的直接python类吗?是的,它们是python类。Django的文档[link]建议使用自定义模型字段无缝地存储和检索数据库中的python对象。我的问题是,在Django域中,什么被认为是获取Python类(从UML模型类图生成)并将该类与模型类集成以实现这些类的持久性的最佳实践。将所有方法都放在Django模型类中可能是一种方法,但最佳实践是什么?在我看来,最佳实践是将功能转换为Django。除此之外,序列化可能是您唯一的选择,但现在是一条捷径,将来可能会带来更多的痛苦。