当创建“vanilla”python类时,如果想要在赋值给属性时执行代码,则通常的模式是创建一个“受保护”(lead-underscore)属性来保存数据,并使用{{1创建getter和setter。
现在,如果我想用Django模型做到这一点,那将是没有吸引力的,尤其是因为我必须搜索该属性的下划线版本。
在Django中为字段分配运行代码的推荐方法是什么?
我无法发现这样做的信号;我能看到的唯一其他方法是使用可以注册其他getter / setter处理程序的自定义Field。
答案 0 :(得分:1)
你根本无法在非自定义字段上执行此操作,因为没有实际的“字段”:它是一个简单的属性,后面没有类。
您需要定义自定义字段类并覆盖to_python
- 不要忘记将元类设置为SubfieldBase
。
答案 1 :(得分:1)
看起来像脏地是你想要的。您无法在设置值的同时进行拦截,但可以在保存之前挂钩。 http://code.activestate.com/pypm/django-dirtyfields/
或者,您应该使用set方法设置@properties
。当然,这需要您使用getter和setter复制实际的django.db.models.fields
字段。