2013-02-19 89 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