我正在使用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_name
,last_name
和email
。其余字段可以为空。
然后我运行服务器并发出测试POST请求以创建新的候选者。问题是,即使我没有指定任何字段,它也只是给它们所有空字符串值(""
)。
我听说过Django模型字段的blank
属性,但它仅适用于表单验证而不适用于HTTP请求。
现在看来我能解决问题的唯一方法是覆盖save()
类上的BaseModel
函数并检查所有CharField是否已填满或者引发错误。
思考?提前谢谢!
答案 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