Django迁移未检测到所有更改。

8
我有以下模型。其中BaseClass1BaseClass2是被模型使用的抽象模型。
在这种情况下,模型AdBreak被视图集和序列化器使用。当我运行python manage.py makemigrations时,检测到了对AdBreak模型的更改。但并没有创建AdBreakStatus模型。
由于AdBreakStatusAdBreak相关联,我期望也会出现关于AdBreakStatus的迁移。我的理解是否正确?
编辑:
在最初的状态中,只有AdBreakBaseClass1模型。在新的状态中,添加了AdBreakStatusBaseClass2模型。从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

数据库迁移将数据库从一个状态转换到另一个状态。您只展示了一个状态;如果不知道您的模型(或表)在此之前的样子,那么这个问题就无法回答。 - Chris
最初的状态下,只有AdBreak和BaseClass1模型。 在新状态下,添加了AdBreakStatus和BaseClass2模型。 AdBreak的一些字段被移动到AdBreakStatus中。 - Roopak A Nelliat
@Chris:如果我添加一个指向AdBreakStatus的视图集,就会检测到迁移。还有其他方法吗? - Roopak A Nelliat
4个回答

5

我使用了多种方式解决这个问题。

解决方案1

有一个序列化器AdBreakSerializer,用于对模型AdBreak进行序列化。 将AdBreakStatus模型导入到AdBreakSerializer文件中。 现在AdBreakStatus模型被检测到并迁移。

这种方法的问题在于,导入没有被使用,因此不会遵循标准。

解决方案2

在与AdBreak相同的文件中编写AdBreakStatus模型类。 这也可以解决问题。


查找/理解

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

需要迁移的所有模型都应该处于此遍历路径中。 或者只有以这种方式遍历的模型才会被迁移。


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

3

首先要做的是:

python manage.py makemigrations 'your-app'
python manage.py migrate

如果以上操作无法检测到更改,请删除迁移文件夹,打开数据库并打开表django_migrations。您将看到与您的应用程序相关联的迁移列表,请删除记录,然后执行makemigrations和migrate。

1
该解决方案适用于应用程序处于测试版/初始开发阶段,但不适用于应用程序的后期阶段。 - Roopak A Nelliat

3

如果有人犯了和我一样的错误,那么可能是因为我添加的字段与现有属性具有相同的名称。因此,请确保字段名称尚未使用。


-1

删除迁移文件夹和sqlite文件,然后运行

python manage.py makemigrations 'app_name'
python manage.py migrate

这个解决方案适用于应用程序处于测试版/初始开发阶段。但不适用于应用程序的后期阶段。 - Roopak A Nelliat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接