2012-04-03 65 views
4

创建“vanilla”python类时,如果想要在赋值给属性时执行代码,通常要创建一个用于保存数据的“protected”(leading-underscore)属性的模式,并使用property创建获取者和设置者。钩入django字段赋值

现在,如果我想用Django模型来做到这一点,那将是没有吸引力的,至少因为我将不得不搜索属性的下划线版本。

什么是在Django的字段分配上运行代码的推荐方法?

有没有信号,我可以找到做到这一点;我可以看到唯一的另一种方法是使用可以注册其他getter/setter处理程序的自定义字段。

回答

1

你根本无法在非自定义字段上做到这一点,因为没有实际的“字段”:它是一个简单的属性,没有类。

您需要定义自定义字段类并覆盖to_python - 不要忘记将元类设置为SubfieldBase

1

它看起来像dirtyfields是你想要的。您不能在完全同时设定值的情况下进行拦截,但您可以在保存之前挂钩。 http://code.activestate.com/pypm/django-dirtyfields/

或者,您应该使用set方法设置@properties。当然这需要你用getter和setter复制实际的django.db.models.fields字段。