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

Python 如果我在模型上更改外键/其他关系,Django makemigrations工具将失败,python,django,postgresql,migrate,makemigrations,Python,Django,Postgresql,Migrate,Makemigrations,我对Djang makemigrations/migrate工具有问题 我有一个带foreignkey的提取模型到Employee表。一切正常 models.py from django.contrib.auth.models import User class Withdraw(models.Model): employee_id = models.ForeignKey(Employee, on_delete = models.PROTECT) amount = models

我对Djang makemigrations/migrate工具有问题

  • 我有一个带foreignkey的提取模型到Employee表。一切正常
  • 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)
    
  • 我想更改它并将用户作为用户的外键:

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

  • 我运行makemigrations,并收到以下错误消息:

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

  • 如果我按1,那么我有以下消息,我没有真正得到,为什么我应该把datetime或timezone.now给用户
  • 选择一个选项:1 现在请输入默认值,作为有效的Python datetime和django.utils.timezone模块可用,因此您可以执行例如timezone.now之类的操作 键入“exit”退出此提示

  • 我试图删除migrates文件夹并重新创建迁移文件,正如其他一些论坛帖子所建议的那样。当我使用createmigrations-draw命令重新创建迁移并将其迁移到postgresql时,不会创建收回表,但工具正在写入已创建并迁移的表
  • 因此,无论哪种方式,我都无法将这个小更改迁移到DB。你有什么意见吗?
    谢谢

    如果不添加默认值或使字段为空,则需要填充所有现有条目。您只需将字段设置为空即可

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

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

    如果不添加默认值或使字段为空,则需要填充所有现有条目。您只需将字段设置为空即可

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

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

    是的,这是自然行为

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


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

    是的,这是自然行为

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


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

    我不认为设置
    blank=True,null=True
    是一个好主意。在填充了所需用户后,可以将其删除,但在创建它之前不能这样填充它。我不认为设置
    blank=True,null=True
    是个好主意。它可以在填充了所需用户之后删除,但在创建它之前不能这样填充。如何在添加字段之前逐个填充它们?如果有超过您可以手动填写的条目,该怎么办?@jTiKey抱歉,错误地说我们必须提供一次性默认值,您如何在添加字段之前逐个填充这些条目?如果您无法手动填写的条目太多怎么办?@jTiKey抱歉,错误地说我们必须提供一次性默认值