【问题标题】:Django makemigrations tool fails if i change the foreign key / other relationships at models如果我更改模型中的外键/其他关系,Django makemigrations 工具将失败
【发布时间】:2020-07-10 07:03:44
【问题描述】:

我对 Djang makemigrations / 迁移工具有疑问

  1. 我有一个带外键到 Employee 表的 Withdraw 模型。一切正常

模型.py

from django.contrib.auth.models import User

class Withdraw(models.Model):
    employee_id = models.ForeignKey(Employee, on_delete = models.PROTECT)
    amount = models.IntegerField(default=0)
    withdraw_date = models.DateTimeField(default=timezone.now)
    is_confirmed_by_employer = models.BooleanField(default=False)
  1. 我想更改它并将用户作为用户的外键:

    user = models.ForeignKey(User, on_delete=models.CASCADE)

  2. 我运行 makemigrations 并收到以下错误消息:

您正在尝试添加一个不可为空的字段“用户”以在没有默认值的情况下退出;我们不能这样做(数据库需要一些东西来填充现有的行)。 请选择一个修复: 1) 现在提供一次性默认值(将在所有现有行上设置此列的空值) 2)退出,让我在models.py中添加一个默认值

  1. 如果我按 1,那么我有以下消息,我没有真正得到什么,我为什么要把 datetime 或 timezone.now 给用户??

选择一个选项:1 请立即输入默认值,作为有效的 Python datetime 和 django.utils.timezone 模块可用,因此您可以执行例如时区.now 键入“exit”退出此提示

  1. 按照其他论坛帖子中的建议,我尝试删除 migrates 文件夹并重新创建迁移文件。当我使用 createmigrations Withdraw 命令重新创建迁移并将其迁移到 postgresSql 时,不会创建 Withdraw 表,但是该工具正在写入该表已创建和迁移。

所以无论哪种方式,我都无法将这个小改动迁移到数据库。你有什么意见吗? 谢谢!

【问题讨论】:

    标签: python django postgresql migrate makemigrations


    【解决方案1】:

    是的,这是自然行为。

    这里发生的事情是, 当您第一次在数据库中创建其他行时(在创建用户字段之前)用户字段不存在,现在当您在此数据库中添加用户字段时,您没有将其设置为空或空白,因此 Django 询问“以前保存的情况如何行?它们不能为空。”所以最好的选择是通过提供一个默认值来填充这些字段。为此,您必须选择选项 1,然后填充那些缺失的空格。

    我不建议@jTiKey 给出答案,因为如果您允许用户字段为空白或空,用户可以在不给用户字段的情况下退出,我认为您不会想要这样。

    【讨论】:

    • 如何在添加字段之前一一填充它们?如果条目比您手动填写的多怎么办?
    • @jTiKey 抱歉,错误地说我们必须提供一个默认值
    【解决方案2】:

    不添加默认值或使字段为空,需要填充所有现有条目。您可以让该字段能够为 Null。

    user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    

    或者在第 4 步中,您可以输入任何现有用户的 ID。 (如果您没有删除它,1 将是您创建的第一个帐户。)

    【讨论】:

    • 我不认为设置blank=True, null=True 是个好主意。
    • 它可以在填充了所需用户后删除,但您不能在创建它之前以这种方式填充它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2021-07-07
    • 2018-01-10
    • 2013-05-27
    • 2023-01-26
    • 2021-11-14
    • 2017-11-20
    相关资源
    最近更新 更多