提问者:小点点

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


我对Djang makemigrations/migrate工具有问题

  1. 我有一个带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)

我想更改它并将用户作为用户的外键:

用户=模型。ForeignKey(用户,on_delete=models.CASCADE)

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

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

选择一个选项: 1请现在输入默认值,因为有效的Python日期时间和django.utils.timezone模块是可用的,所以你可以这样做,例如timezone.now键入“退出”退出此提示

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


共2个答案

匿名用户

是的,这是自然行为。

这里发生的事情是,当你第一次在数据库中制作其他行(在制作用户字段之前)用户字段不存在,现在当你在这个数据库中添加用户字段时,你没有将其设置为空或空,所以Django问“怎么样以前保存的行?它们不可能是空的。"所以最好的选择是通过提供一次性默认值来填充这些字段。要做到这一点,你必须选择选项1,然后填补这些缺失的空间。

我不推荐@jTiKey给出的答案,因为若你们允许users字段为空或null,用户可以在不给出users字段的情况下退出,我想你们不会想要的。

匿名用户

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

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

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