まず、必要 モデルメタクラスを使用する 、すなわち。 ModelBase コード>
、タイプ
ではありません :
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
適切なメタクラスを使用したら 、 ModelBase
である多くのクラス属性を使用しているため、無数のエラーが発生する可能性があります。 内部で設定し、自分で設定することを期待していません。
モデルが持つすべての属性をダンプするのではなく、 ModelBase
の属性のみを設定する必要があります 以下を含む従来のモデルに設定されることを期待しています:
-
__ module __
および__ qualname __
- モデルフィールド
- カスタムマネージャーまたはクエリセット
- モデルメソッド
- モデル
メタ
それ以外はすべて省略してください。
たとえば、このようなモデルがある場合は、モジュール 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
私はあなたがPythonに精通していない metaclasses