【问题标题】:Django: Quickly deal with adding non-nullable fieldDjango:快速处理添加不可为空的字段
【发布时间】:2016-02-12 14:18:41
【问题描述】:

在开发模型时,我经常在运行makemigrations 时遇到不可空字段错误:

You are trying to add a non-nullable field 'user' to randommodel without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option: 

几乎每次我收到此错误时,我都非常乐意删除该表中的数据(在开发过程中通常只有几个测试条目),并且只删除它而不是确定什么会更有效一个合适的默认值是。

但是目前我没有合适的方法来执行此操作并最终刷新数据库和/或删除迁移,这是相当繁重但有效的方法。

删除该模型/表中的数据以消除错误的最佳方法是什么? (会是通过 shell/shell_plus 吗?)

型号:

class RandomModel(models.Model):
    user_details = JSONField(unique=True)
    user = models.ForeignKey(User)

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    即使您已删除该表中的所有记录,在运行makemigrations 时,您仍会被要求再次提供默认值。这是因为您正在为现有表创建新的迁移文件。

    我能想到的一个解决方案是告诉 Django,您通过运行 migrate app_name zero 重新启动 app_name。这将取消应用曾经应用于您的数据库的所有迁移文件。

    然后删除app_name 中的所有迁移文件。并再次运行makemigrations。这将创建一个新的初始迁移文件。然后您只需使用migrate 将其应用到您的数据库。

    正如您所说,您不介意删除您的数据。这甚至更好。您甚至不必删除任何记录。它只会创建一个具有相同名称的新表,其中包含所有新字段和 0 条记录。

    【讨论】:

    • 删除迁移文件时,我还必须删除引用该特定应用的任何其他应用中的迁移文件。
    • 您没有声明对您的模型有任何引用。但我很高兴您找到了解决方案。
    猜你喜欢
    • 2016-08-09
    • 2019-04-08
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多