2010-03-22 64 views
6

我想在將數據保存到數據庫表之前對數據進行編碼,並在從數據庫表中讀取數據之後對其進行解碼。我想覆蓋django獲取和保存方法。如何覆蓋django模型中的get方法?

類似:

class UserData(models.Model): 
    userid = models.IntegerFields 
    data = models.charField(max_length=25) 

    def save(self, *args, **kwargs): 
     encode_data(self.data) 
     super(UserData, self).save(*args, **kwargs) 

    def get(self, *args, **kwargs): 
     data = super(UserData, self).get(*args, **kwargs) 
     return decode_data(data) 

Django模型有保存方法,我能夠覆蓋它,做我想做的。但是,他們似乎沒有get方法,我可以覆蓋。 我該如何做到這一點?我想要在調用UserData.objects.all()或UserData.objects.get()或UserData.objects.get()或任何其他此類可用方法時解碼數據。

回答

5

通常,你通過覆蓋__init__來做到這一點。但由於Django Models上的__init__做了各種各樣的時髦業務,所以不推薦重寫它。相反,監聽post_init信號,並在那裏做你的解碼:

def my_decoder(instance, **kwargs): 
    instance.decoded_stuff = decode_this(instance.encoded.stuff) 

models.signals.post_init.connect(my_decoder, UserData) 
+0

不錯,簡單,yum –

+0

這非常有幫助,謝謝。 Django發出文檔信號:https://docs.djangoproject.com/en/dev/ref/signals/ –

6

嘗試閱讀有關編寫自定義管理器的文檔。記住,你不打電話Model,但在Model.objects,這是一種經理。這裏是文檔: https://docs.djangoproject.com/en/dev/topics/db/managers/

+1

這樣做,這樣最終會要求您創建一個自定義的查詢集爲好,因爲get,過濾器和一個經理的所有方法僅僅是傳遞了由Manager的get_query_set方法返回的QuerySet上的相應方法。 –

+2

該頁面不存在。 – Alagu

+0

顯然它被移動了。 https://docs.djangoproject.com/en/1.3/topics/db/managers/ – gruszczy