Chcete-li začít, potřebujete používat metatřídu modelu , tj. kód>
, a nikoli typ
:
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
Jakmile použijete správnou metatřídu , pravděpodobně obdržíte nesčetné množství chyb, protože používáte mnoho atributů třídy, které ModelBase
nastavuje interně a neočekává, že se nastavíte sami.
Namísto vyprázdnění všech atributů, které má váš model, byste měli nastavit pouze atributy, které ModelBase
očekává, že bude nastaven na tradiční model, který zahrnuje:
__modul__
a__qualname__
- pole modelu
- vlastní správci nebo sady dotazů
- modelové metody
- model
Meta
Vše ostatní by mělo být vynecháno.
Pokud tedy máte například modely, které vypadají takto, v modulu 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'
Dynamická verze těchto modelů musí vypadat takto:
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'}),
})
Nerozumím účelu vašeho migračního kódu, takže budu předpokládat, že to byl hack ve snaze zprovoznit dynamické modely, což znamená, že jej pravděpodobně můžete úplně vyhodit a použít vestavěný zavaděč migrace, tj.:
python3 manage.py makemigrations myapp && python3 manage.py migrate myapp
Neznáte python metaclasses
, doporučoval bych si je přečíst, protože je to nezbytný předpoklad pro pochopení mého kódu.