我想为Django模型字段定义一个setter
函数,以便验证输入,并在值无效时立即引发错误。
由于我无法控制的事情,我认为doing the validation in save()
or pre_save()
对我的问题不是一个可行的解决方案。
同时将字段更改为属性并使用普通field.getter
和field.setter
是不可行的,因为这会破坏字段上的.filter()
,.exclude()
等等。即使我将field
更改为_field
并覆盖了经理,也需要更改方案。
那么,我是否被迫覆盖__setattr__
或者有更好的方法吗?
答案 0 :(得分:2)
您可以继承字段并覆盖to_python
。
class UnforgivingCharField(CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if not passes_my_test(value):
raise Hell()
return super(UnforgivingCharField, self).to_python(value)
在设置值时以及get_prep_value
等期间使用此值,因此在过滤时会捕获无效值。
有关此here的更多信息。请注意,链接部分底部的行会告诉我们to_python
将被调用。
修改:万一您恰好使用South,如果您实施自定义模型字段,则需要添加一些introspection rules。
答案 1 :(得分:1)
请参阅此django门票:
https://code.djangoproject.com/ticket/3148
此外,请参阅此处进行讨论:
Django model fields getter / setter
这篇博文:
http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/
另请注意,您可以选择使用自定义管理器为您翻译filter
kwargs
,并将_name
用于字段,并自行制作@name.setter
{ {1}}等等。
答案 2 :(得分:0)
您能定义一个提供正确功能并引发正确错误的函数吗?
class YourModel(models.Model):
def add_your_value(self, value):
# check if value is correct
# raise exception if it isn't
# set correct property