[英]Django models and legacy class integration
如果我有来自遗留代码的现有类(从某些 UML 模型生成),将它们与 Django model 类集成的最佳方法是什么?
到目前为止,我已经考虑使用 Django 自定义字段来序列化 class 并让它处理持久性。 (这样做的缺点是其他直接访问数据库的应用程序——如果它曾经成为一个要求——必须反序列化这个字段才能访问数据。)
如果有人可以提出上述替代方案 - 以某种方式可以“换掉”我现有课程的持久性,那将不胜感激!
如果您尝试将旧版应用程序移至 django,我同意 @chrisdpratt 的观点,您应该尝试将您的类转换为 Django 模型。 这将需要很大的努力,所以当你准备好时,你可以遵循这条小路:
创建一个legacy
应用程序并将你的遗留代码放在那里。
如果您认为您的代码不是那么重要,并且您只想获取数据,并且它存储在基于 SQL 的服务器中,您可以尝试使用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=old#running来自您的代码的管理命令)。
在新应用程序(“ 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."
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.