繁体   English   中英

Django 型号和传统 class 集成

[英]Django models and legacy class integration

如果我有来自遗留代码的现有类(从某些 UML 模型生成),将它们与 Django model 类集成的最佳方法是什么?

到目前为止,我已经考虑使用 Django 自定义字段来序列化 class 并让它处理持久性。 (这样做的缺点是其他直接访问数据库的应用程序——如果它曾经成为一个要求——必须反序列化这个字段才能访问数据。)

如果有人可以提出上述替代方案 - 以某种方式可以“换掉”我现有课程的持久性,那将不胜感激!

如果您尝试将旧版应用程序移至 django,我同意 @chrisdpratt 的观点,您应该尝试将您的类转换为 Django 模型。 这将需要很大的努力,所以当你准备好时,你可以遵循这条小路:

  1. 创建一个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来自您的代码的管理命令)。

  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."

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM