Django миграции базы данных останавливаются с добавлением класса "Meta" - PullRequest
1 голос
/ 26 мая 2020

Я создал приложение Django, и у меня есть такая модель:

class Company(models.Model):
    name = models.TextField(max_length = 200)

Когда я запускаю python3 manage.py makemigrations appname, все работает, как ожидалось, и создается файл миграции для класса .

Проблема возникает, если класс в модели также определяет класс Meta:

class Company(models.Model):
    name = models.TextField(max_length = 200)
    class Meta:
        app_label = "Companies"

Теперь, если я запускаю команду makemigrations, я либо получаю " никаких изменений не обнаружено », и файл миграции не создается:

> python3 manage.py makemigrations myApp
No changes detected in app 'appname'

Или, что еще хуже, если модель с классом Meta не имеет зависимостей (внешних ключей), создается миграция, которая будет полностью удалить модель / таблицу.

Или, если есть зависимость (ссылка на внешний ключ из другой модели), я получаю такую ​​ошибку:

matcher.OtherTable.foreignkeyref: (fields.E300) Field defines a relation with model 'Company', which is either not installed, or is abstract.

Все модели с * Определенный класс 1021 * по какой-то причине не будет генерировать миграцию, ни первоначальную, ни последующую. Классы, для которых мета добавлена ​​постфактум, будут удалены при следующей миграции. Становится так, как будто их вообще нет.

Я использую Python 3.8.3 и Django 3.0.6 на Ma c OS 10.15.5.

1 Ответ

1 голос
/ 26 мая 2020

Все модели с определенным классом Meta не будут генерировать миграцию, ни первоначальную, ни любую последующую миграцию по какой-либо причине. Классы, в которые добавлено Meta постфактум, будут удалены при следующей миграции. приложение, которому оно принадлежало изначально, но где-то еще. Итак, для этого приложения модели «исчезли», а для нового приложения (здесь Companies) оно появилось «из воздуха». Как указано в документации , app_label используется, когда:

Если модель определена вне приложения в INSTALLED_APPS, она должна объявить, какому приложению она принадлежит (…).

Указывать app_label довольно редко. Если вы не укажете его, будет использовано имя приложения, в котором оно определено.

Похоже, вы, тем не менее, переопределяете неправильную настройку. В зависимости от переданного значения вы, вероятно, захотите указать параметр verbose_name_plural [Django -doc] :

class Company(models.Model):
    name = models.TextField(max_length = 200)

    class Meta:
        <b>verbose_name_plural</b> = "Companies"
...