Om te beginnen heb je nodig om de model metaclass te gebruiken , dwz. ModelBase
, en niet type
:
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
Zodra u de juiste metaclass gebruikt, , zult u waarschijnlijk een groot aantal fouten ontvangen, aangezien u veel klassekenmerken gebruikt die ModelBase
wordt intern ingesteld en verwacht niet dat u uzelf instelt.
In plaats van alle kenmerken die uw model heeft te dumpen, moet u alleen de kenmerken instellen die ModelBase
verwacht te worden ingesteld op een traditioneel model, waaronder:
__module__
en__qualname__
- modelvelden
- aangepaste managers of querysets
- modelmethoden
- model
Meta
Al het andere moet worden weggelaten.
Dus als je bijvoorbeeld een model hebt dat er zo uitziet, in de 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'
De dynamische versie van deze modellen moet er als volgt uitzien:
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'}),
})
Ik begrijp het doel van je migratiecode niet, dus ik ga ervan uit dat het een hack was in een poging om de dynamische modellen werkend te krijgen, wat betekent dat je het waarschijnlijk helemaal kunt weggooien en de ingebouwde migratielader kunt gebruiken, dat wil zeggen:
python3 manage.py makemigrations myapp && python3 manage.py migrate myapp
Ik ben niet bekend met python metaclasses
, raad ik aan om er meer over te lezen, omdat het een vereiste is om mijn code te begrijpen.