我有一个消息模型。对于这个模型,我想添加一个读/未读字段,我通过使用布尔字段来完成。现在,如果有人读取此消息,我希望此布尔字段变为true。我在我的应用程序的不同部分访问这些消息,因此手动更新字段将是乏味的。
有什么办法可以根据某些条件获取一些消息,当从db中获取消息时,该字段会自动更新吗?
答案 0 :(得分:2)
为什么不在custom model manager上创建read_message()
方法。让此方法返回您想要的消息,同时还更新返回的每条消息的字段。
您可以使用新方法将Message.objects.get()
替换为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
然后在您的模型中包含经理 -
class Message(models.Model):
objects = MessageManager()
显然,您可以编写其他返回查询集的方法,同时将所有返回的消息标记为已读。
如果您不想更新代码(您调用Message.objects.get()
的地方),那么您可以实际覆盖get()
,以便更新read
字段。只需将上面的read_message
功能名称替换为get
。
答案 1 :(得分: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应用程序之外。