Django模型和遗留类集成

Mic*_*ael 5 python database django django-models

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

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

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

Udi*_*Udi 2

如果您尝试将遗留应用程序迁移到 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=olddocs#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."
Run Code Online (Sandbox Code Playgroud)