更改models.py

时间:2019-12-07 21:31:48

标签: python django postgresql django-models django-migrations

在将问题标记为重复之前,请阅读我的问题。我已经通过StackOverflow寻求解决方案,但是没有找到任何可以解决我问题的方法。

我有一个模型,其中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和迁移操作,这些迁移未反映在DB中。也没有错误。当我的代码尝试从数据库读取时,出现错误“列:价格不存在”。

我通过参考StackOverflow其他问题尝试了以下操作:

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

请注意

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

我需要django迁移才能自动应用所做的更改。由于此问题,仅添加新列和修改列的数据类型根本不起作用(Rest操作(如删除列)有效。

请帮助。

1 个答案:

答案 0 :(得分:1)

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

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