Untuk memulai, Anda perlu untuk menggunakan model metaclass , yaitu. ModelBase
, dan bukan type
:
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
Setelah Anda menggunakan metaclass yang tepat , Anda mungkin akan menerima banyak sekali kesalahan, karena Anda menggunakan banyak atribut kelas yang ModelBase
mengatur secara internal, dan tidak mengharapkan Anda untuk mengatur sendiri.
Daripada membuang semua atribut yang dimiliki model Anda, Anda sebaiknya hanya menyetel atribut yang ModelBase
diharapkan untuk menggunakan model tradisional, yang meliputi:
__module__
dan__qualname__
- bidang model
- pengelola khusus atau kumpulan kueri
- metode model
- model
Meta
Segala sesuatu yang lain harus dihilangkan.
Jadi misalnya, jika Anda memiliki model yang terlihat seperti ini, di modul 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'
Versi dinamis dari model ini harus terlihat seperti ini:
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'}),
})
Saya tidak mengerti tujuan kode migrasi Anda, jadi saya akan berasumsi bahwa itu adalah peretasan dalam upaya untuk membuat model dinamis berfungsi, yang berarti Anda mungkin dapat membuangnya sama sekali dan menggunakan pemuat migrasi bawaan, yaitu:
python3 manage.py makemigrations myapp && python3 manage.py migrate myapp
Saya Anda tidak akrab dengan python metaclasses
, saya sarankan untuk membacanya, karena ini adalah prasyarat untuk memahami kode saya.