为非属性模型字段创建setter的正确方法是什么

时间:2012-09-28 12:32:55

标签: django django-models setter

我想为Django模型字段定义一个setter函数,以便验证输入,并在值无效时立即引发错误。

由于我无法控制的事情,我认为doing the validation in save() or pre_save()对我的问题不是一个可行的解决方案。

同时将字段更改为属性并使用普通field.getterfield.setter是不可行的,因为这会破坏字段上的.filter().exclude()等等。即使我将field更改为_field并覆盖了经理,也需要更改方案

那么,我是否被迫覆盖__setattr__或者有更好的方法吗?

3 个答案:

答案 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