शुरू करने के लिए, आपको जरूरत मॉडल मेटाक्लास . का उपयोग करने के लिए , अर्थात। ModelBase
कोड>
, न कि type
:
from django.db.models.base import ModelBase
model_definition = ModelBase(
model_item.table_name,
bases,
model_config
)
एक बार जब आप उचित मेटाक्लास . का उपयोग कर लेते हैं , आपको असंख्य त्रुटियां प्राप्त होने की संभावना है, क्योंकि आप कई वर्ग विशेषताओं का उपयोग कर रहे हैं जो ModelBase
आंतरिक रूप से सेट करता है, और आपसे स्वयं को सेट करने की अपेक्षा नहीं कर रहा है।
आपके मॉडल में मौजूद सभी विशेषताओं को डंप करने के बजाय, आपको केवल उन विशेषताओं को सेट करना चाहिए जो ModelBase
हैं एक पारंपरिक मॉडल पर सेट होने की उम्मीद है, जिसमें शामिल हैं:
__module__
और__qualname__
- मॉडल फ़ील्ड
- कस्टम प्रबंधक या क्वेरीसेट
- मॉडल के तरीके
- मॉडल
Meta
बाकी सब कुछ छोड़ दिया जाना चाहिए।
इसलिए उदाहरण के लिए, यदि आपके पास ऐसे मॉडल हैं जो इस तरह दिखते हैं, तो मॉड्यूल में 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
मैं आप अजगर से परिचित नहीं हैं metaclasses
, मैं उन पर पढ़ने की सलाह दूंगा, क्योंकि यह मेरे कोड को समझने के लिए एक शर्त है।