首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django模型与遗留类集成

Django模型与遗留类集成
EN

Stack Overflow用户
提问于 2011-06-03 07:26:51
回答 1查看 445关注 0票数 5

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

到目前为止,我已经考虑过使用Django自定义字段来序列化类,并让该类处理持久性。(这样做的缺点是,其他直接访问数据库的应用程序-如果需要这样的话-将不得不反序列化这个字段,以便访问数据。)

如果有人可以提出一些替代上述方案-以某种方式,围绕我现有的类的持久性可以“交换”,这将是非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2011-06-06 06:09:47

如果您想将遗留应用程序迁移到django,我同意@chrisdpratt,您应该尝试将类转换为Django模型。这需要付出很大的努力,所以当您准备好之后,您可以遵循以下步骤:

  1. 创建了一个应用程序,并将遗留代码放在那里. 如果您认为您的代码不那么重要,并且只想获取数据,并且它存储在基于SQL的服务器中,那么您可以尝试使用检查b创建“遗留模型”,从遗留服务器读取数据。我建议为此配置第二个名为“旧式”的DB连接。请参阅: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-management-commands-from-your-code )。
  2. 在一个新的应用程序("**myapp**").Optionally,中创建新的django模型,您可以再次使用检查b从db中自动获得基本模型。但是,请确保将模型重命名为标准Django外观,并删除任何不必要的字段和属性。
  3. 创建一个脚本,读取遗留数据并将其写入新模型.
  4. 将所需的逻辑从旧类迁移到新类.

您可以将它用作步骤3的脚本的框架:

代码语言:javascript
复制
  # 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."
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6224208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档