Python Django在空白字符字段上引发异常

Python Django在空白字符字段上引发异常,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在使用Django和REST框架构建一个API,为AngularJS网站提供数据。我需要确保所有的验证都在后端完成 我有一个名为候选人的模型: class Candidate(CreatedModel): first_name = CharField(max_length=30) last_name = CharField(max_length=100) email = CharField(max_length=254, unique=True) phone

我正在使用Django和REST框架构建一个API,为AngularJS网站提供数据。我需要确保所有的验证都在后端完成

我有一个名为候选人的模型:

class Candidate(CreatedModel):

    first_name = CharField(max_length=30)
    last_name = CharField(max_length=100)
    email = CharField(max_length=254, unique=True)
    phone = CharField(max_length=20, null=True)
    resume_path = CharField(max_length=200, null=True)
    notes = TextField(null=True)
在模型中,只需要
名字
姓氏
电子邮件
。其余字段可以为空

然后我运行服务器并发出一个testpost请求来创建一个新的候选对象。问题是,即使我没有指定任何字段,它也只会给它们所有空字符串值(
“”

我听说Django模型字段的
blank
属性,但它只适用于表单中的验证,而不适用于HTTP请求

现在看来,我能解决这个问题的唯一方法是重写
BaseModel
类上的
save()
函数,并检查所有字符字段是否已填充,否则将引发错误


想法?提前谢谢

这里解释了它发生的原因:

避免对基于字符串的字段(如CharField和 TextField,因为空字符串值将始终存储为空 字符串,而不是NULL。如果基于字符串的字段具有null=True,则 表示它有两个可能的“无数据”值:NULL和empty 一串在大多数情况下,有两个可能的值是多余的 “无数据;”Django约定使用空字符串,而不是NULL


如果不希望数据库中出现空字符串,只需在表单中将字段标记为
required
。或者使用DRF

经过一些研究,我找到了一种避免将空字符串保存在数据库中的方法。我创建了一个名为
NonBlankCharField
的自定义Django
字段,它继承
CharField
并覆盖
允许的空字符串

class NonBlankCharField(CharField):
    empty_strings_allowed = False
然后我使用了这个
字段
,而不是
字符字段
。如果未指定不应为
NULL的
字段
,则会引发
完整性异常

如果查看Django的源代码(在models/fields.py文件中),它会显示:

def get_default(self):
    """
    Returns the default value for this field.
    """
    if self.has_default():
        if callable(self.default):
            return self.default()
        return self.default
    if (not self.empty_strings_allowed or (self.null and
               not connection.features.interprets_empty_strings_as_nulls)):
        return None
    return ""
这就是
字段
获取其默认值的方式<默认情况下,
CharField
的code>empty\u strings\u allowed
设置为
True
,因此这会覆盖该设置,并使其将
字段保存为
None
,然后引发
异常

然而,其他答案建议使用DRF验证器,这可能是侵入性较小的,因此我将在解决方案的基础上进行此操作。


谢谢大家的帮助。

如果您使用drf,您可以在序列化中使用验证器:我认为如果您使用Python EVE,如果您正在构建REST API,您将快100倍@谢谢你!我会调查验证器!如果你需要帮助,尽管问。祝你好运谢谢你的回复!我将考虑更改空字符串值的策略。我不能使用
必需的
,因为我没有使用Django表单。不过,DRF验证器会有所帮助。很高兴能提供帮助