我有一个消息模型。在这个模型中,我想添加一个已读/未读字段,我通过使用布尔字段来完成。现在,如果有人读到这条消息,我希望这个布尔字段变为真。我在我的应用程序的不同部分访问这些消息,因此手动更新字段会很乏味。
有什么方法可以根据某些条件获取一些消息,并且当从数据库中获取消息时,该字段会自动更新?
我有一个消息模型。在这个模型中,我想添加一个已读/未读字段,我通过使用布尔字段来完成。现在,如果有人读到这条消息,我希望这个布尔字段变为真。我在我的应用程序的不同部分访问这些消息,因此手动更新字段会很乏味。
有什么方法可以根据某些条件获取一些消息,并且当从数据库中获取消息时,该字段会自动更新?
为什么不在自定义模型管理器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
.
根据您的数据库管理系统,您可以安装触发器:
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 应用程序之外。