私はメッセージモデルを持っています。このモデルに、ブール値フィールドを使用して行った既読/未読フィールドを追加したいと考えています。誰かがこのメッセージを読んだら、このブール値フィールドを true に変えたいと思います。アプリのさまざまな部分でこれらのメッセージにアクセスするため、フィールドを手動で更新するのは面倒です。
いくつかの条件に従っていくつかのメッセージを取得する方法はありますか?メッセージがデータベースからフェッチされると、フィールドは自動更新されますか?
私はメッセージモデルを持っています。このモデルに、ブール値フィールドを使用して行った既読/未読フィールドを追加したいと考えています。誰かがこのメッセージを読んだら、このブール値フィールドを true に変えたいと思います。アプリのさまざまな部分でこれらのメッセージにアクセスするため、フィールドを手動で更新するのは面倒です。
いくつかの条件に従っていくつかのメッセージを取得する方法はありますか?メッセージがデータベースからフェッチされると、フィールドは自動更新されますか?
カスタム モデル マネージャ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 アプリケーションの外部で、データベース内で手動で行う必要があります。