2013-02-19 92 views
0

我有一個消息模型。對於這個模型,我想添加一個讀/未讀字段,我通過使用布爾字段來完成。現在,如果有人閱讀這條消息,我希望這個布爾字段變成true。我在我的應用程序的不同部分訪問這些消息,因此手動更新字段會很乏味。實現未讀/讀取檢查消息

有什麼辦法可以根據某些條件得到一些消息,並且當從db中獲取消息時,該字段會自動更新?

回答

2

爲什麼不在custom model manager上創建read_message()方法。讓此方法返回所需的消息,同時更新返回的每條消息的字段。

您新的方法讓你與Message.objects.read_message()

class MessageManager(models.Manager): 
    def read_message(self, message_id): 
     # This won't fail quietly it'll raise an ObjectDoesNotExist exception 
     message = super(MessageManager, self).get(pk=message_id) 
     message.read = True 
     message.save() 
     return message 

更換Message.objects.get()然後包括你的模型經理 -

class Message(models.Model): 
    objects = MessageManager() 

很明顯,你可以編寫返回的查詢集,而標記所有消息的其他方法返回爲已讀。

如果您不想更新您的代碼(您撥打Message.objects.get()的地方),那麼您總是可以覆蓋get(),以便更新read字段。只需將上面的read_message函數名稱替換爲get即可。

+0

這就是我最初做的,但是後來我有太多的地方需要重複這種代碼。我試圖以某種「透明」的方式做到這一點 - 例如在某處傳遞條件和用戶名,併發生自動更新。我想我可以寫一個相同的函數,但我不確定這是否是正確的方法。 – ersran9 2013-02-19 18:29:45

+0

對不起,我應該正確地閱讀你的問題。我已經用新建議更新了我的答案 – 2013-02-19 19:04:21

+0

不錯,我認爲這正是我正在尋找的功能。非常感謝! – ersran9 2013-02-19 20:00:42

1

根據您的數據庫管理系統,你可以安裝一個觸發器:

的PostgreSQL:http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html

的MySQL:http://dev.mysql.com/doc/refman/5.0/en/triggers.html

SQLite的:http://www.sqlite.org/lang_createtrigger.html

當然,這樣會需要在數據庫中手動完成 - 在Django應用程序之外。

+0

有趣的是,我還沒有聽說過觸發器。我會檢查一下。 – ersran9 2013-02-19 18:30:29