Django 迁移未检测到所有更改

Roo*_*iat 6 python migration django

我有以下型号。 BaseClass1BaseClass2是模型使用的抽象模型。

在这种情况下,模型AdBreak由视图集和序列化器使用。当我运行时python manage.py makemigrationsAdBreak检测到模型的变化。模型AdBreakStatus没有被创建。

由于,AdBreakStatus链接到AdBreak,我AdBreakStatus也期待迁移。我的理解有误吗?

编辑

在初始状态,只有 AdBreak 和 BaseClass1 模型。添加了新状态、AdBreakStatus 和 BaseClass2 模型。AdBreak 中的一些字段已移至 AdBreakStatus。

在此先感谢您的帮助。

class BaseClass1(models.Model):
    class Meta:
        abstract=True
    timestamp = models.DateTimeField(auto_now_add=True)

class BaseClass2(models.Model):
    class Meta:
        abstract=True
    other_field = models.IntegerField()

class AdBreak(BaseClass1):
    class Meta:
        db_table = "ad_break"
    ad_break_id = models.AutoField(primary_key=True)
    ... # Other fields

class AdBreakStatus(BaseClass2):
    class Meta:
        db_table = "ad_break_status"
    ad_break = models.ForeignKey(AdBreak)
    ... # Other Fields
Run Code Online (Sandbox Code Playgroud)

Roo*_*iat 5

我通过多种方式解决了。

解决方案1

有一个AdBreakSerializer序列化模型的序列化器AdBreakAdBreakStatus将模型导入到AdBreakSerializer文件中。现在AdBreakStatus模型已被检测并迁移。

这种方法的问题是,不使用导入,因此不遵循标准。

解决方案2

AdBreakStatus将模型类写入AdBreak. 这也将解决问题。


发现/理解

makemigrations脚本查找从 连接的模型urls.py。该脚本先导航urls.py到所有视图集,然后导航到相应的序列化器和模型。

所有需要迁移的模型都应该出现在这个遍历的路径中。或者只有那些以这种方式遍历的模型才会被迁移。

  • 你的发现是正确的,但它们只是 Django 工作方式的副作用(事实上,直到添加了导入你的 urls.py 的 URL 系统检查之前,这并不是真的)。Django 显式导入“INSTALLED_APPS”中每个应用程序的“models”子模块。如果您想要加载模型,请确保将其导入到 `models.py` 或 `models/__init__.py` 中。这样,您就不会依赖任何可能在应用程序开发过程中发生变化的导入链。它还提供了一个方便的地方来在一个地方访问模型,即使它们是在多个文件中定义的。 (4认同)