Python как вывести динамический создать класс в файл - PullRequest
0 голосов
/ 02 июля 2019

Я был динамическим создателем метакласса Python

Я хочу записать его в файл Python

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

Мне это нужно, потому что, когда django делает миграцию, ему нужно найти метакласс для модели, но мой метакласс модели был динамически генерируемым

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

1 Ответ

0 голосов
/ 05 июля 2019

Хотя в 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()
...