Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Nie można przeprowadzić migracji za pomocą ModelState i ProjectState za pomocą API migracji w Django 3.0.3

Aby rozpocząć, potrzebujesz używać metaklasy modelu , tj. ModelBase , a nie typ :

from django.db.models.base import ModelBase

model_definition = ModelBase(
    model_item.table_name,
    bases,
    model_config
)

Gdy użyjesz właściwej metaklasy , prawdopodobnie otrzymasz mnóstwo błędów, ponieważ używasz wielu atrybutów klas, które ModelBase ustawia się wewnętrznie i nie oczekuje, że sam się ustawisz.

Zamiast zrzucać wszystkie atrybuty, które posiada Twój model, powinieneś ustawić tylko te atrybuty, które ModelBase oczekuje, że zostanie ustawiony na tradycyjny model, który obejmuje:

  • __moduł__ i __qualname__
  • pola modelu
  • niestandardowi menedżerowie lub zestawy zapytań
  • metody modelowe
  • model Meta

Wszystko inne należy pominąć.

Na przykład, jeśli masz modele, które wyglądają tak, w module 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'

Dynamiczna wersja tych modeli musi wyglądać tak:

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'}),
})

Nie rozumiem celu twojego kodu migracji, więc zakładam, że był to hack mający na celu uruchomienie modeli dynamicznych, co oznacza, że ​​prawdopodobnie możesz go całkowicie wyrzucić i użyć wbudowanego modułu ładującego migrację, tj.:

python3 manage.py makemigrations myapp && python3 manage.py migrate myapp

Nie znasz Pythona metaklasy , polecam zapoznać się z nimi, ponieważ jest to warunek wstępny zrozumienia mojego kodu.




  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:dynamiczne określanie klucza podstawowego tabeli

  2. SQL wielu wstawek za pomocą Pythona

  3. Dopasowanie ciągu zapytania MySQL SELECT

  4. Czy istnieje szybszy sposób ładowania mysqldumps?

  5. mySQL wybierz W zakresie