2012-04-03 66 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字段。