Để bắt đầu, bạn cần sử dụng siêu kính mô hình , I E. ModelBase
chứ không phải loại
:
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
Sau khi bạn sử dụng metaclass thích hợp , bạn có thể sẽ nhận được vô số lỗi, vì bạn đang sử dụng nhiều thuộc tính lớp ModelBase
thiết lập nội bộ và không mong đợi bạn tự thiết lập.
Thay vì kết xuất tất cả các thuộc tính mà mô hình của bạn có, bạn chỉ nên đặt các thuộc tính ModelBase
dự kiến sẽ được đặt trên một mô hình truyền thống, bao gồm:
-
__module__
và__qualname__
- trường mô hình
- bộ quản lý hoặc bộ truy vấn tùy chỉnh
- phương pháp mô hình
- mô hình
Meta
Mọi thứ khác nên được bỏ qua.
Vì vậy, ví dụ:nếu bạn có một mô hình giống như thế này, trong mô-đun 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'
Phiên bản động của các mô hình này cần có dạng như sau:
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'}),
})
Tôi không hiểu mục đích của mã di chuyển của bạn, vì vậy tôi sẽ cho rằng đó là một cuộc tấn công nhằm cố gắng làm cho các mô hình động hoạt động, có nghĩa là bạn có thể ném nó ra ngoài hoàn toàn và sử dụng trình tải di chuyển nội trang, tức là:
python3 manage.py makemigrations myapp && python3 manage.py migrate myapp
Tôi, bạn không quen thuộc với python metaclasses
, Tôi khuyên bạn nên đọc chúng, vì đó là điều kiện tiên quyết để hiểu mã của tôi.