Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Django 3.0.3 में माइग्रेशन API का उपयोग करके ModelState और ProjectState का उपयोग करके माइग्रेट करने में असमर्थ

शुरू करने के लिए, आपको जरूरत मॉडल मेटाक्लास . का उपयोग करने के लिए , अर्थात। 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 , मैं उन पर पढ़ने की सलाह दूंगा, क्योंकि यह मेरे कोड को समझने के लिए एक शर्त है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में दिनों को कैसे घटाएं?

  2. किसी समय को निकटतम 15 मिनट के खंड में कैसे गोल करें

  3. जीमेल सर्च इतनी तेज कैसे है?

  4. जावा में डेटाबेस में छवि जोड़ना

  5. क्या php/mysql के लिए sql इंजेक्शन की पहचान करने के लिए कोई स्थिर विश्लेषण उपकरण है?