首先,你need正在使用模型元类, ie. ModelBase, 并不是type
:
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
一旦你使用正确的元类,您可能会收到无数错误,因为您使用了许多类属性ModelBase
在内部设置,并不期望您自己设置。
您不应转储模型具有的所有属性,而应仅设置以下属性:ModelBase
期望以传统模式为背景,其中包括:
-
__module__
and __qualname__
- 模型字段
- 自定义管理器或查询集
- 模型方法
- model
Meta
其他一切都应该被省略。
例如,如果您有一个如下所示的模型,则在模块中myapp.models
:
class Parent(models.Model):
name = models.CharField(max_length=45)
class Child(models.Model):
name = models.CharField(max_length=45)
parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
class ModelWithMeta(models.Model):
class Meta:
db_table = 'some_table'
这些模型的动态版本需要如下所示:
from django.db import models
from django.db.models.base import ModelBase
bases = (models.Model,)
Parent = ModelBase('Parent', bases, {
'__module__': 'myapp.models',
'__qualname__': 'Parent',
'name': models.CharField(max_length=45),
})
Child = ModelBase('Child', bases, {
'__module__': 'myapp.models',
'__qualname__': 'Child',
'name': models.CharField(max_length=45),
'parent': models.ForeignKey('myapp.Parent', on_delete=models.CASCADE),
})
ModelWithMeta = ModelBase('ModelWithMeta', bases, {
'__module__': 'myapp.models',
'__qualname__': 'ModelWithMeta',
'Meta': type('Meta', (), {'db_table': 'some_table'}),
})
我不明白你的迁移代码的目的,所以我假设这是一个试图让动态模型工作的黑客,这意味着你可能可以完全扔掉它并使用内置的迁移加载器,即:
python3 manage.py makemigrations myapp && python3 manage.py migrate myapp
我你不熟悉Pythonmetaclasses,我建议阅读它们,因为这是理解我的代码的先决条件。