0

我对 Djang makemigrations / migrate 工具有疑问

  1. 我有一个 Employee 表的外键提取模型。一切正常

模型.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 Please enter the default value now, as valid Python the datetime and django.utils.timezone modules are available, so you can do eg timezone.now 键入'exit'退出此提示

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

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

4

2 回答 2

1

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

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

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

于 2020-03-29T23:04:41.623 回答
1

是的,这是自然行为。

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

我不推荐@jTiKey 给出的答案,就好像您允许用户字段为空白或空一样,用户可以在不给用户字段的情况下退出,我认为您不会想要这样。

于 2020-03-29T23:12:08.523 回答