在 models.py 中更改属性的数据类型后,Django 迁移未应用于 Postgres

Django migrations not getting applied on Postgres after changing the datatype of an attribute in models.py

我有这个模型,其中 price 是一个整数字段。我做了 运行 迁移,一切都很好。

from django.db import models

class Bill(models.Model):
    price= models.IntegerField()

然后由于需求变化,我不得不将 price 字段设为 JSONField,它将基于类似于此

的某些键存储 price
price={"actual_price":100, "tax_price":20}

我对模型进行了如下更改:

from django.db import models

class Bill(models.Model):
    price= JSONField(blank=True, null=True)

我执行了 makemigrations 和 migrate 操作,迁移没有反映在数据库中。也没有错误。当我的代码尝试从数据库中读取时,出现错误 "Column: price does not exist"。

我参考了Whosebug的其他问题尝试了以下事情:

  1. 删除了该字段。 运行 迁移,应用它。删除现场工作 美好的。但是当我重新添加字段而不是将其视为新字段时 要添加的字段,它只是没有被插入。
  2. 正在从 migrations.py 文件夹中删除迁移,重新 运行 并重新应用它。

请注意:

  1. 我正在使用 Postgres 数据库。同样的事情适用于 Django 内部提供的 SQLite 数据库,但不适用于 Postgres。
  2. 丢失数据不是一个可行的选择,因为数据库数据来自生产服务器。
  3. 我尝试使用查询 ALTER Table ADD Column 通过 PostGres 手动 添加列,效果非常好。这是我使用的钩子,作为最后的手段使用。
  4. 在应用更新的迁移之前,某些记录的初始整数字段中的数据存在。奇怪的是 Django 也没有要求我设置值以防我想覆盖数据。

我需要 Django 迁移来自动应用更改才能工作。由于这个问题,只有添加新列和修改列的数据类型根本不起作用(删除列等其他操作有效)。

由于没有其他选择,也没有提供解决方案,我不得不将我的应用程序指向 PostGres 中的新数据库,然后它开始正常工作。未来的经验教训:

  1. 不要直接更新模型属性的数据类型然后应用迁移。
  2. 首先删除字段,应用迁移,然后创建具有相同名称和所需数据类型的字段,然后应用迁移。
  3. 使用您在本地生产中使用的相同数据库。这样可以避免部署到生产后的冲突。我曾将 SQLite 用于本地,将 PostGres 用于生产。从现在开始,我也将在本地使用 PostGres,这样我就可以在本地调试问题。