Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tidak dapat bermigrasi menggunakan ModelState dan ProjectState menggunakan API migrasi di Django 3.0.3

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menyinkronkan database MySQL antara dua database jarak jauh (tanpa teknik replikasi database MySQL)

  2. ZF2 membersihkan variabel untuk kueri DB

  3. Bagaimana saya bisa menemukan karakter non-ASCII di MySQL?

  4. Cara Mendapatkan Catatan dari 10 Menit Terakhir di MySQL

  5. MySQL LOAD_FILE mengembalikan NULL