Aby rozpocząć, potrzebujesz używać metaklasy modelu , tj. ModelBase
, a nie typ
:
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
Gdy użyjesz właściwej metaklasy , prawdopodobnie otrzymasz mnóstwo błędów, ponieważ używasz wielu atrybutów klas, które ModelBase
ustawia się wewnętrznie i nie oczekuje, że sam się ustawisz.
Zamiast zrzucać wszystkie atrybuty, które posiada Twój model, powinieneś ustawić tylko te atrybuty, które ModelBase
oczekuje, że zostanie ustawiony na tradycyjny model, który obejmuje:
__moduł__
i__qualname__
- pola modelu
- niestandardowi menedżerowie lub zestawy zapytań
- metody modelowe
- model
Meta
Wszystko inne należy pominąć.
Na przykład, jeśli masz modele, które wyglądają tak, w module 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'
Dynamiczna wersja tych modeli musi wyglądać tak:
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'}),
})
Nie rozumiem celu twojego kodu migracji, więc zakładam, że był to hack mający na celu uruchomienie modeli dynamicznych, co oznacza, że prawdopodobnie możesz go całkowicie wyrzucić i użyć wbudowanego modułu ładującego migrację, tj.:
python3 manage.py makemigrations myapp && python3 manage.py migrate myapp
Nie znasz Pythona metaklasy
, polecam zapoznać się z nimi, ponieważ jest to warunek wstępny zrozumienia mojego kodu.