Mysql
 sql >> база данни >  >> RDS >> Mysql

Не може да се мигрира с помощта на ModelState и ProjectState с помощта на API за миграции в Django 3.0.3

За да започнете, вие необходими да използвате метакласа на модела , т.е. L72 код> , а не type :

from django.db.models.base import ModelBase

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

След като използвате правилния метаклас , вероятно ще получите безброй грешки, тъй като използвате много атрибути на класа, които ModelBase задава вътрешно и не очаква да се настроите сами.

Вместо да изхвърляте всички атрибути, които има вашия модел, трябва да зададете само атрибутите, които ModelBase очаква да бъде настроен на традиционен модел, който включва:

  • __module__ и __qualname__
  • моделни полета
  • персонализирани мениджъри или набори от заявки
  • моделни методи
  • модел Мета

Всичко останало трябва да се пропусне.

Така например, ако имате модели, които изглеждат така, в модула 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

Не сте запознати с метакласове на python , препоръчвам да ги прочетете, тъй като това е предпоставка за разбиране на моя код.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Коя е по-бърза една голяма заявка или няколко малки заявки?

  2. Комбинирайте INSERT и SELECT в една SQL заявка (Zapier)

  3. Как да боравим с наследена база данни в рамката на Django

  4. Mysql резултати в PHP - масиви или обекти?

  5. Основи на външните ключове в MySQL?