【问题标题】:Django error while saving Foreign Key - Can not assign none , Doesn't allow null values保存外键时出现 Django 错误 - 无法分配无,不允许空值
【发布时间】:2016-09-27 10:34:39
【问题描述】:

我有两个模型 - 事件和租户。

class EventsModel(models.Model):
    sys_id = models.AutoField(primary_key=True, null=False, blank=True)
    tenant_sys_id = models.ForeignKey('tenant.TenantModel', on_delete = models.CASCADE, null=False, blank=True)
    name = models.CharField(max_length=80, null=False, blank=False)
    start_date_time = models.DateTimeField(null=False, blank=False)
    end_date_time = models.DateTimeField(null=False, blank=False) 
    created_when = models.DateTimeField(null=False, blank=True)   

    def save(self, *args, **kwargs):
        self.created_when = timezone.now()
        self.tenant_sys_id = 1 #for-testing-only. actual current_logged_in_user.tenant_sys_id
        return super(EventsModel, self).save(*args, **kwargs)

此模型有一个 FK tenant_sys_id 到租户模型。如果为此我设置 null = False,则会引发以下错误。

ValueError('Cannot assign None: "EventsModel.tenant_sys_id" does not allow null values.',)  

我正在从登录的用户详细信息中以覆盖的保存方法设置此字段的值。 设置 null = True 不会引发此错误。

但是,我对 created_when 字段执行相同操作,但未显示此行为。无论 null=True/False,值都是从 save 方法设置并保存。

我在查看文件中收到此错误。

form = EventsForm(request.POST)
print(request.POST) # print
print(form) # do not print. error here <--
if form.is_valid(): # error here if above line is commented.
    form.save()

ModelForm类

class EventsForm(ModelForm):
    class Meta:
        model = EventsModel
        fields = '__all__'

所以这里我无法理解-

  1. 为什么我必须将 FK 设置为 null=True 而不是 created_when 才能工作。
  2. 为什么它在创建表单时抛出错误,而不是在保存数据时。

【问题讨论】:

    标签: python django django-models foreign-keys


    【解决方案1】:

    您的 ForeignKey 应称为 tenant_sys,而不是 tenant_sys_id。 Django 会自动将_id 后缀添加到底层数据库字段中,但是您在 Python 中拥有的值实际上是目标模型的实例,而不是 ID。

    使用您拥有的代码,您仍然没有设置 db 值;您设置了对象,Django 实际上会将其转换为tenant_sys_id_id,但 db 列仍然为空,因此存在完整性错误。之所以没有表单验证错误,是因为你在字段定义上也有blank=True

    【讨论】:

    • 感谢您的帮助。我仍然有问题 - (1) 在从 ModelForm 类创建表单对象时出现错误,而不是在保存方法中。 (2) 为什么当我在 FK 上设置 null = True 时它会起作用。
    • 还有这个 - code.djangoproject.com/ticket/24787 。据此,我们无法在模型中的 FK 上使用 null= False 和 blank=True。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2017-11-16
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多