Django迁移未检测到所有更改

时间:2017-03-29 12:33:29

标签: python django migration

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

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

由于AdBreakStatusAdBreak相关联,因此我预计也会迁移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

4 个答案:

答案 0 :(得分:1)

我以多种方式解决了它。

解决方案1 ​​

序列化程序AdBreakSerializer序列化了模型AdBreak。 将AdBreakStatus模型导入AdBreakSerializer文件。 现在检测并迁移了AdBreakStatus模型。

  

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

解决方案2

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

查找/理解

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

  

需要迁移的所有模型都应该进入此遍历的路径。 OR 只迁移以这种方式遍历的模型。

答案 1 :(得分:0)

如果有人犯了与我相同的错误,就我而言,这是因为我添加的字段与现有属性具有相同的名称。因此,请确保尚未使用该字段名称。

答案 2 :(得分:-1)

首先执行此操作:

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

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

答案 3 :(得分:-2)

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

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