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
。这样,您就不需要依赖于在应用程序开发过程中可能发生变化的任何导入链。它还提供了一个方便的位置,可以在一个位置访问模型,即使模型是在多个文件中定义的。