За да започнете, вие необходими да използвате метакласа на модела , т.е. L72 код>
, а не type
:
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
, препоръчвам да ги прочетете, тъй като това е предпоставка за разбиране на моя код.