我有一個消息模型。對於這個模型,我想添加一個讀/未讀字段,我通過使用布爾字段來完成。現在,如果有人閱讀這條消息,我希望這個布爾字段變成true。我在我的應用程序的不同部分訪問這些消息,因此手動更新字段會很乏味。實現未讀/讀取檢查消息
有什麼辦法可以根據某些條件得到一些消息,並且當從db中獲取消息時,該字段會自動更新?
我有一個消息模型。對於這個模型,我想添加一個讀/未讀字段,我通過使用布爾字段來完成。現在,如果有人閱讀這條消息,我希望這個布爾字段變成true。我在我的應用程序的不同部分訪問這些消息,因此手動更新字段會很乏味。實現未讀/讀取檢查消息
有什麼辦法可以根據某些條件得到一些消息,並且當從db中獲取消息時,該字段會自動更新?
爲什麼不在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
即可。
根據您的數據庫管理系統,你可以安裝一個觸發器:
的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應用程序之外。
有趣的是,我還沒有聽說過觸發器。我會檢查一下。 – ersran9 2013-02-19 18:30:29
這就是我最初做的,但是後來我有太多的地方需要重複這種代碼。我試圖以某種「透明」的方式做到這一點 - 例如在某處傳遞條件和用戶名,併發生自動更新。我想我可以寫一個相同的函數,但我不確定這是否是正確的方法。 – ersran9 2013-02-19 18:29:45
對不起,我應該正確地閱讀你的問題。我已經用新建議更新了我的答案 – 2013-02-19 19:04:21
不錯,我認爲這正是我正在尋找的功能。非常感謝! – ersran9 2013-02-19 20:00:42