Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django迁移未检测到所有更改_Python_Django_Migration - Fatal编程技术网

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

Python Django迁移未检测到所有更改,python,django,migration,Python,Django,Migration,我有以下几种型号。 BaseClass1和BaseClass2是模型使用的抽象模型 在这种情况下,视图集和序列化程序使用模型AdBreak。 当我运行python manage.py makemigrations时,会检测到AdBreak模型上的更改。未创建模型AdBreakStatus 因为,AdBreakStatus链接到了AdBreak,所以我也期待着AdBreakStatus的迁移。我的理解错了吗 编辑 在初始状态下,只有AdBreak和BaseClass1模型。添加了新的state、A

我有以下几种型号。
BaseClass1
BaseClass2
是模型使用的抽象模型

在这种情况下,视图集和序列化程序使用模型
AdBreak
。 当我运行
python manage.py makemigrations
时,会检测到
AdBreak
模型上的更改。未创建模型
AdBreakStatus

因为,
AdBreakStatus
链接到了
AdBreak
,所以我也期待着
AdBreakStatus
的迁移。我的理解错了吗

编辑


在初始状态下,只有AdBreak和BaseClass1模型。添加了新的state、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

删除迁移文件夹和sqlite文件。然后跑

python manage.py makemigrations 'app_name'
python manage.py migrate
首先要这样做:

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

我用多种方法解决了这个问题。 解决方案1 有一个序列化程序
AdBreakSerializer
,用于序列化模型
AdBreak
。 将
AdBreakStatus
模型导入
AdBreakSerializer
文件。 现在检测并迁移了
AdBreakStatus
模型

这种方法的问题是,没有使用进口,因此不会遵循标准

解决方案2 在
AdBreak
的同一文件中写入
AdBreakStatus
模型类。这也将解决问题


发现/理解
makemigrations
脚本查找从
url.py
连接的模型。脚本从
url.py
导航到所有视图集,然后导航到相应的序列化程序和模型

所有需要迁移的模型都应该位于该遍历的路径中仅迁移以这种方式遍历的模型


如果有人犯了与我相同的错误,在我的例子中,这是因为我添加的字段与现有属性同名。因此,请确保尚未使用字段名。

数据库迁移会将数据库从一种状态转换为另一种状态。你只向我们展示了一个州;在不知道您的模型(或表)以前是什么样子的情况下,无法回答此问题。在初始状态下,只有AdBreak和BaseClass1模型。添加了新的state、AdBreakStatus和BaseClass2模型。AdBreak中的某些字段已移动到AdBreakStatus。@克里斯:如果我添加一个指向
AdBreakStatus
的视图集,则会检测到迁移。还有其他方法吗?当应用程序处于测试/初始开发阶段时,此解决方案很好。不适用于应用程序的后期阶段。当应用程序处于beta/初始开发阶段时,此解决方案很好。不适合应用程序的后期阶段您的发现是正确的,但它们只是Django工作方式的副作用(事实上,在添加URL系统检查以导入您的
URL.py
)之前,情况并非如此)。Django显式导入安装的应用程序中每个应用程序的
模型
子模块。如果要加载模型,请确保将其导入到
models.py
models/\uuu init\uuuu.py
。这样,您就不需要依赖于在应用程序开发过程中可能发生变化的任何导入链。它还提供了一个方便的位置,可以在一个位置访问模型,即使模型是在多个文件中定义的。