Django在模型初始化时对缺失值的行为不清楚

时间:2018-10-16 18:40:29

标签: django model

我有一个postgres数据库和一个模型,其字段为blank = False和null = True。 假设:

class MyModel(models.Model):
    param1 = models.CharField(max_length=1024)
    param2 = models.CharField(max_length=1024)
    info = models.CharField(max_length=1024, blank=False, null=False) 

现在,当我创建这样的模型时:

m = MyModel(param1=val1, param2=val2)

在保存时,info字段基本上不会引发任何异常。甚至,在使用info方法之后,它将在数据库中为save保留一个空值。

已更新
像这样实例化模型时:
m = MyModel(param1=val1, param2=val2, info=None)
在这种情况下,保存将引发异常

任何建议为什么会发生?我认为,如果我错过了在模型初始化中添加值的情况,则至少应将其假定为None,但事实并非如此。我用谷歌搜索,但找不到具体的答案。但是,发现只有full_clean()模型方法可以执行检查并引发如下异常:

ValidationError: {'info': ['This field cannot be blank.'], 'owner': ['This field cannot be blank.']}

欢迎任何帮助!

2 个答案:

答案 0 :(得分:1)

因此,经过研究,我得出了以下答案:
首先,blank仅代表表单验证,null代表数据库验证(docs)。同样,Django始终假定缺少参数的值为空,但这些字段类型的行为略有不同。

主要区别在于:

  • Char字段-它使用空字符串(即''),这是默认的Django实现。因此,如果Django发现缺少参数,则不会为该类型的字段传递None,因为不建议将NULL存储在char字段的DB中。 (details here

  • 其他字段-它使用一个空值(为None)。因此Django看到有一个缺失的参数,它将假定为None。但是由于数据库限制null = False,它将引发异常。

因此,得出的结论是,仅通过null=False方法检查应该使用数据库约束save的非字符字段,以通过引发异常来检查是否缺少参数。

现在,如果您还想为Charfields引发异常,则需要使用full_clean(由表单使用),它将告诉您什么类型的字段不能为空白(或丢失)。因此,最后,正确的方法是使用blank=False,然后使用full_clean检测丢失的Charfields。或/并且,如果模型的clean()方法对这些字段有一些附加的逻辑,则为you can override

答案 1 :(得分:-1)

info = models.CharField('Facts and features', max_length=1024)