For at starte skal du bruge at bruge model-metaklassen , dvs. ModelBase kode>
, og ikke type
:
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
Når du har brugt den rigtige metaklasse , vil du sandsynligvis modtage et utal af fejl, da du bruger mange klasseattributter, der ModelBase
indstiller internt og forventer ikke, at du skal indstille dig selv.
I stedet for at dumpe alle de attributter, som din model har, bør du kun indstille de attributter, der ModelBase
forventer at blive sat på en traditionel model, som omfatter:
__modul__
og__qualname__
- modelfelter
- tilpassede administratorer eller forespørgselssæt
- modelmetoder
- model
Meta
Alt andet bør udelades.
Så hvis du for eksempel har en model, der ser sådan ud, i modulet 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'
Den dynamiske version af disse modeller skal se sådan ud:
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'}),
})
Jeg forstår ikke formålet med din migreringskode, så jeg vil antage, at det var et hack i forsøget på at få de dynamiske modeller til at fungere, hvilket betyder, at du sandsynligvis kan smide den helt ud og bruge den indbyggede migrationsindlæser, dvs.:
python3 manage.py makemigrations myapp && python3 manage.py migrate myapp
Jeg er ikke bekendt med python metaklasser
, jeg vil anbefale at læse op på dem, da det er en forudsætning for at forstå min kode.