【问题标题】:python how to dump dynamic create class to filepython如何将动态创建类转储到文件
【发布时间】:2019-11-12 18:07:02
【问题描述】:

我一直在动态创建一个python元类

我想把它转储到一个 python 文件中

cls = type("ClsName", (object, ), attr)
code = xxxGetSource(cls)
writeToFile(code, "moduleName/ClsName.py")

我需要这个,因为django makemigrations时,它需要找到模型的元类,但我的模型元类是动态生成的

class XXXModel(GenerateCls({ .... }),
               models.Model):
    pass

【问题讨论】:

    标签: python django metaclass inspect


    【解决方案1】:

    虽然 Django 确实有工具可以做到这一点,但实际上并不需要。 您需要的是,在导入 models.py 时,您的动态创建的类必须在模块命名空间中可用。

    因此,您所要做的就是调用在 models.py 模块级别的代码中创建类的任何代码,并确保它们在那里可见 - 它可以很简单:

    from django.db import models
    
    def create_classes():
        Meta = type("Meta", (), {"app_label": "test2"})
        DynamicUser = type("DynamicUser", (models.Model,), {"name": models.TextField(255), "__module__": __file__, "Meta": Meta})
        return DynamicUser
    
    
    DynamicUser = create_classes()
    

    如果您在编码时不知道类的名称和数量,那么您可以使用类及其名称更新globals() 返回的字典。 假设create_classes 函数将返回一个包含类的列表 - 可以在models.py 中执行此操作

    
    def materialize_for_migration():
        classes = create_classes
        globals().update({cls.__name__: cls for cls in classes})
    
    materialize_for_migration()
    

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2019-02-19
      • 2018-11-01
      • 2011-04-24
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多