Python Django模型和遗留类集成

Python Django模型和遗留类集成,python,database,django,django-models,Python,Database,Django,Django Models,如果我有从遗留代码生成的现有类(由一些UML模型生成),那么将它们与Django模型类集成的最佳方法是什么 到目前为止,我已经考虑过使用Django自定义字段来序列化类,并让它处理持久性。(这样做的缺点是,其他直接访问数据库的应用程序(如果需要的话)必须反序列化此字段才能访问数据。) 如果有任何人可以建议上述方法的一些替代方案——在某种程度上,我的现有类周围的持久性可以被“替换掉”,那将不胜感激 如果您试图将遗留应用程序移动到django,我同意@chrisdpratt,您应该尝试将您的类转换为

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

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


如果有任何人可以建议上述方法的一些替代方案——在某种程度上,我的现有类周围的持久性可以被“替换掉”,那将不胜感激

如果您试图将遗留应用程序移动到django,我同意@chrisdpratt,您应该尝试将您的类转换为django模型。这将需要很大的努力,因此当您准备好时,您可以遵循以下路径:

  • 创建一个
    legacy
    应用程序,并将您的legacy代码放在那里。

    如果您认为代码不太重要,只想获取数据,并且数据存储在基于SQL的服务器中,那么可以尝试使用创建“遗留模型”,从遗留服务器读取数据。我建议为此配置第二个名为“legacy”的DB连接。见:

    创建命令行测试脚本以确保可以从数据库加载旧类。(请确保从shell提示符设置/导出环境变量DJANGO_SETTINGS_MODULE,以从命令行运行脚本,或参见)

  • 在新应用程序中创建新的django模型(“
    myapp
    ”)

    或者,您可以再次使用从数据库自动获取基本模型。但是,请确保将模型重命名为标准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."
    

    如果将序列化数据存储在数据库中是答案,那么通常情况下,您提出的问题是错误的这是非常糟糕的做法,应该尽可能避免。也就是说,我真的不明白你想做什么。这些是您试图集成到Django项目中的直接python类吗?是的,它们是python类。Django的文档[link]建议使用自定义模型字段无缝地存储和检索数据库中的python对象。我的问题是,在Django域中,什么被认为是获取Python类(从UML模型类图生成)并将该类与模型类集成以实现这些类的持久性的最佳实践。将所有方法都放在Django模型类中可能是一种方法,但最佳实践是什么?在我看来,最佳实践是将功能转换为Django。除此之外,序列化可能是您唯一的选择,但现在是一条捷径,将来可能会带来更多的痛苦。