尝试进行迁移时获得“以下内容类型已过时,需要删除”。这是啥意思,我该如何解决?

Posted

技术标签:

【中文标题】尝试进行迁移时获得“以下内容类型已过时,需要删除”。这是啥意思,我该如何解决?【英文标题】:Getting a "The following content types are stale and need to be deleted" when trying to do a migrate. What does this mean, and how can I solve it?尝试进行迁移时获得“以下内容类型已过时,需要删除”。这是什么意思,我该如何解决? 【发布时间】:2016-03-07 13:31:35 【问题描述】:

这是我的models.py:

class Notification(models.Model):
    user = models.ForeignKey(User)
    createdAt = models.DateTimeField(auto_now_add=True, blank=True)
    read = models.BooleanField(default=False, blank=True)

    class Meta:
        abstract = True

class RegularNotification(Notification):
    message = models.CharField(max_length=150)
    link = models.CharField(max_length=100)

class FNotification(Notification):
    # same as Notification
    pass

当我做python manage.py makemigrations 时,它是这样说的:

Migrations for 'CApp':
  0019_auto_20151202_2228.py:
    - Create model RegularNotification
    - Create model FNotification
    - Remove field user from notification
    - Add field f_request to userextended
    - Delete model Notification

首先,它说Remove field user from notification 很奇怪,因为user 仍然在我的Notiication 模型中(所以如果有人能弄清楚为什么它说它说'从通知中删除字段用户',那就是太棒了!)但是,当我继续前进并尝试做python manage.py migrate时,我收到了这条消息:

Applying CMApp.0019_auto_20151202_2228... OK
The following content types are stale and need to be deleted:

    CApp | notification

Any objects related to these content types by a foreign key will also
be deleted. Are you sure you want to delete these content types?
If you're unsure, answer 'no'.

    Type 'yes' to continue, or 'no' to cancel: no

我输入了no。但这究竟是什么意思,为什么我会收到此消息,以及如何使我不需要此消息?

【问题讨论】:

我得到这个是因为我忘记拉取存储库的最后一次提交。我最新的本地迁移不是存储库中最新的。 :P 我提取了远程代码,再次执行了迁移,我的工作就像一个魅力。 【参考方案1】:

当您移除/删除模型并进行迁移时会触发您收到的消息。

在大多数情况下,您可以安全地删除它们。但是,在某些情况下,这可能会导致数据丢失。如果其他模型对删除的模型有外键,这些对象也将被删除。

Here's the django ticket that requests to make deleting stale content types safer.

编辑

正如@x-yuri 指出的那样,这张票已被修复并已在Django 1.11 发布。

【讨论】:

哦,所以因为我在Notification 模型中添加了Abstract=True,这可能是Django 假设我删除它的原因。知道为什么它说- Remove field user from notification吗?因为userForeignKey还在,那为什么Django会说去掉呢? 我对此并不完全确定。也许您可以添加迁移文件,以便我们检查发生了什么。 @RodXavier 在我的情况下,我有一个模型 A 已使用模型 B、C 的外键删除。这意味着通过迁移,模型 B、C 中的数据将被删除或仅当模型 A 有外键时?谢谢 @Pietro,如果删除表 A 中的陈旧数据,模型 B、C 中的数据不会被删除。 工单中的问题已修复,更改(加上some more)已在Django 1.11 中发布。

以上是关于尝试进行迁移时获得“以下内容类型已过时,需要删除”。这是啥意思,我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Oracle 12c 进行 Flyway 迁移

使用分类器进行面部识别的迁移学习

尝试使用Force.com迁移工具(ANT)进行部署时,我做错了什么

我会在从 v3 迁移到最新 v7 的迁移 lucene 索引中获得性能改进吗

使用迁移到 Worklight 6.3 的现有 6.0.2 代码连接到本地时未在 Worklight 6.3 中获得更新

使用南(django)和 MySQL 进行模式迁移