Mic*_*ael 5 python database django django-models
如果我从遗留代码中获得现有类(从某些UML模型生成),那么将它们与Django 模型类集成的最佳方法是什么?
到目前为止,我已经考虑过使用Django自定义字段来序列化类并让它处理持久性.(这样做的缺点是其他应用程序直接访问数据库 - 如果它是一个要求 - 必须反序列化该字段才能访问数据.)
如果有人可以提出上述的一些替代方案 - 以某种方式,我现有的课程的持久性可以'换出',我们将不胜感激!
如果您尝试将遗留应用程序迁移到 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=olddocs#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."
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
422 次 |
最近记录: |