4

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

由于我无法控制的事情,我不认为对我的问题进行验证save()或者pre_save()是一个可行的解决方案。

还将该字段更改为属性并使用纯文本field.getter并且field.setter不可行,因为这将在该字段上破坏等,而且即使我更改为并覆盖了经理,它.filter()也需要更改方案.exclude()field_field

那么,我是被迫重写__setattr__还是有更好的方法呢?

4

3 回答 3

2

您可以将 Field 子类化并覆盖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 ,如果您实现自定义模型字段,则需要添加一些自省规则。

于 2012-09-28T17:21:09.193 回答
0

看到这张 django 票:

https://code.djangoproject.com/ticket/3148

另外,请参阅此处进行讨论:

Django 模型字段 getter / setter

而这篇博文:

http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/

另请注意,可以选择使用filter kwargs为您翻译的自定义管理器,使用_name字段,以及制作您自己的@name.setter @name.getter等。

于 2012-09-28T12:52:51.093 回答
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
于 2012-09-28T14:37:49.923 回答