【发布时间】:2010-12-10 03:13:16
【问题描述】:
模型字段的验证在django中应该去哪里?
我至少可以说出两种可能的选择:在模型的重载 .save() 方法中或在 models.Field 子类的 .to_python() 方法中(显然,要使其工作,您必须编写自定义字段)。
可能的用例:
- 绝对有必要确保不会将空字符串写入数据库(blank=False 关键字参数在此处不起作用,仅用于表单验证)
- 当有必要确保时,“选择”关键字参数在数据库级别得到尊重,而不仅仅是在管理界面(模拟枚举数据类型)
models.Field 基类定义中还有一个类级别属性empty_strings_allowed,派生类很乐意覆盖它,但是它似乎对数据库级别没有任何影响,这意味着我仍然可以构造一个具有空字符串字段的模型并将其保存到数据库中。我想避免(是的,这是必要的)。
可能的实现是
在现场层面:
class CustomField(models.CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if not value:
raise IntegrityError(_('Empty string not allowed'))
return models.CharField.to_python(self, value)
在模型层面:
class MyModel(models.Model)
FIELD1_CHOICES = ['foo', 'bar', 'baz']
field1 = models.CharField(max_length=255,
choices=[(item,item) for item in FIELD1_CHOICES])
def save(self, force_insert=False, force_update=False):
if self.field1 not in MyModel.FIELD1_CHOICES:
raise IntegrityError(_('Invalid value of field1'))
# this can, of course, be made more generic
models.Model.save(self, force_insert, force_update)
也许,我遗漏了一些东西,这可以更容易(更清洁)吗?
【问题讨论】:
标签: python django django-models