Django 即使所需的图表字段不存在';t集显式

Django 即使所需的图表字段不存在';t集显式,django,Django,我创建了几个模型,比如组织。我在测试中注意到的问题是,我可以在模型上使用create方法,即使short\u description为空或不为空,它也会保存一个新实例 我确实设置了验证器,但它没有帮助 班级组织(models.Model): #使用信号预保存自动创建 代码=models.CharField( 主键=真, 最大长度=255, 空白=假, null=False, help_text='可用于标识组织的唯一代码或id' ) name=models.CharField( 最大长度=255

我创建了几个模型,比如组织。我在测试中注意到的问题是,我可以在模型上使用
create
方法,即使
short\u description
为空或不为空,它也会保存一个新实例

我确实设置了验证器,但它没有帮助

班级组织(models.Model):
#使用信号预保存自动创建
代码=models.CharField(
主键=真,
最大长度=255,
空白=假,
null=False,
help_text='可用于标识组织的唯一代码或id'
)
name=models.CharField(
最大长度=255,
空白=假,
null=False,
help_text='组织的简称'
)
简短描述=models.CharField(
最大长度=255,
空白=假,
null=False,
help_text='简要概述组织',
验证器=[MinLengthValidator(1)]
)
试验

#这将通过
@pytest.mark.django_db
def test_organization_create():
obj=Organization.objects.create(name='TEST')
断言对象代码
期望的行为是我创建的任何
组织
实例,如果我没有指定
简短描述
将抛出错误

我在测试中注意到的问题是,我可以在模型上使用create方法,即使
short\u description
为空或不为空,它也会保存一个新实例

这是正确的。出于性能原因,Django的ORM调用将忽略验证器

您可以使用以下命令验证对象:

@pytest.mark.django\u db
def test_organization_create():
obj=组织(名称='TEST')
obj.full_clean()#将引发错误
obj.save()
断言对象代码

Django将完全清除,因此通过表单输入数据将生成有效对象(对于添加到表单中的字段非常有效)。这就是为什么要使用Django的表单来处理用户对模型对象的输入的众多原因之一。

你是说“简短描述”吗?没有验证器和完整描述还有其他方法吗?我不明白如果我明确地设置
blank=False,null=False
,为什么还要做其他的动作。我希望这是强制性的,需要重新雇用。无论我用
组织(…).save()
组织.objects.create()
创建什么?我已经设置该字段不能为空,并且blank@ArtemDumanov:其中一些属性,如
null=False
转换为数据库级别,但所有自定义验证程序本质上都是可调用的,可以是任何内容,因此无法转换为数据库。您可以在
save()
方法中添加
full\u clean(..)
调用,但这不适用于
Organization.objects.update(short\u description='')
。所以一般来说你无法解决这个问题。如果我使用DRF,我可以问你如何处理这个问题吗?我应该验证什么、在哪里以及如何验证?@ArtemDumanov;DRF不使用
full_clean
,而是通过序列化程序级别定义的验证器进行验证:
@pytest.mark.django_db
def test_organization_create():
    obj = Organization(name='TEST')
    obj.full_clean()  # will raise an error
    obj.save()
    assert obj.code