Django在空白CharFields上引发Exception

时间:2016-07-20 13:13:38

标签: python django django-rest-framework

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

我有一个名为Candidate的模型:

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)

在模型中,只需要first_namelast_nameemail。其余字段可以为空。

然后我运行服务器并发出测试POST请求以创建新的候选者。问题是,即使我没有指定任何字段,它也只是给它们所有空字符串值("")。

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

现在看来我能解决问题的唯一方法是覆盖save()类上的BaseModel函数并检查所有CharField是否已填满或者引发错误。

思考?提前谢谢!

2 个答案:

答案 0 :(得分:2)

经过一番研究,我发现了一种避免在我的数据库中保存空字符串的方法。我创建了一个名为Field的自定义Django NonBlankCharField,它继承CharField并覆盖empty_strings_allowed

class NonBlankCharField(CharField):
    empty_strings_allowed = False

然后我使用此Field代替CharField。如果没有指定IntegrityException Field,则会NULL提升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 ""

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

Field

这是empty_strings_allowed获取默认值的方式。 True默认设置为CharField Field,因此会覆盖该None并将Exception保存为In [15]: result = np.zeros_like(vals) In [16]: result[mask > 0] = vals[:mask.sum()] In [17]: result Out[17]: array([2, 3, 4, 5, 0, 0, 6, 0]) ,然后提升{{1}} }。

但是,其他答案建议使用DRF验证器,这可能是较少侵入性的,所以我会在我的解决方案之上做到这一点。

感谢大家的帮助。

答案 1 :(得分:1)

为什么会发生这种情况:https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.Field.null

  

避免在基于字符串的字段(如CharField和)上使用null   TextField,因为空字符串值将始终存储为空   字符串,而不是NULL。如果基于字符串的字段具有null = True,那么   意味着它有两个可能的“无数据”值:NULL,空   串。在大多数情况下,拥有两个可能的值是多余的   “没有数据;”Django约定是使用空字符串,而不是NULL。

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