【问题标题】:Django database migrations stop with addition of "Meta" classDjango 数据库迁移随着“元”类的添加而停止
【发布时间】:2020-05-25 22:59:08
【问题描述】:

我已经创建了一个 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.

定义了Meta 类的所有模型都不会生成迁移,无论是初始迁移还是由于某种原因的任何后续迁移。事后添加了 Meta 的类将在下一次迁移时被删除。就好像它们根本不存在一样。

我在 Mac OS 10.15.5 上使用 Python 3.8.3 和 Django 3.0.6。

【问题讨论】:

  • 好吧,你指定了一个不同的app_label,那么tit 应该是python3 manage.py makemigrations Companies,但更改app_label 的情况很少见。

标签: python django django-3.0


【解决方案1】:

定义了Meta 类的所有模型都不会生成迁移,无论是初始迁移还是出于某种原因的任何后续迁移。事后添加了Meta 的类将在下次迁移时被删除。

问题是你改变了app_label,现在你说这个模型不属于它最初所属的应用程序,而是其他地方。所以对于那个应用程序,模型已经“消失”,而对于一个新应用程序(Companies 这里),它似乎是“凭空出现的”。正如documentation 中所指定的,在以下情况下使用app_label

如果模型是在 INSTALLED_APPS 中的应用程序之外定义的,它必须声明它属于哪个应用程序 (...)。

很少指定app_label。如果你不指定它,它会使用它定义的应用程序的名称。

您似乎覆盖了错误的设置。根据您传递的值,您可能希望指定verbose_name_plural option [Django-doc]

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

    class Meta:
        verbose_name_plural = "Companies"

【讨论】:

  • 这似乎已经解决了。看着我几年前创建的旧的 sn-p 代码,我不知何故弄乱了我的版本,这是错误的。
猜你喜欢
  • 2016-10-30
  • 1970-01-01
  • 2015-02-17
  • 2015-12-20
  • 2018-03-04
  • 2020-02-29
  • 2018-04-13
  • 2022-11-27
  • 2014-07-30
相关资源
最近更新 更多