如果我更改模型中的外键/其他关系,Django makemigrations 工具将失败

Django makemigrations tool fails if i change the foreign key / other relationships at models

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

  1. 我有一个 Withdraw 模型,外键指向员工 table。一切正常

models.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. 我想更改它并将用户作为用户的外键:

    用户=models.ForeignKey(用户,on_delete=models.CASCADE)

  2. 我 运行 makemigrations 我有这个错误消息:

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

中添加一个默认值
  1. 如果我按 1,然后我有以下消息,我没有真正得到什么,为什么我要将日期时间或 timezone.now 给用户??

Select一个选项:1 现在请输入默认值,有效Python datetime 和 django.utils.timezone 模块可用,所以你可以做,例如timezone.now 键入 'exit' 退出此提示

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

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

不添加默认值或将字段设为空,需要填充所有现有条目。你可以让这个字段能够为空。

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

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

是的,这是自然行为。

这里发生的事情是, 当你第一次在数据库中创建其他行时(在创建用户字段之前)用户字段不存在,现在当你在这个数据库中添加一个用户字段时你没有将它设置为 null 或空白所以 Django 询问 "what about previous saved rows? They can't be null."所以最好的选择是通过提供一个关闭默认值来填充这些字段。为此,您必须选择选项 1,然后填写缺失的空格。

我不推荐@jTiKey 给出的答案,因为如果您允许用户字段为空或为空,用户可以在不提供用户字段的情况下退出,我认为您不会希望这样。