Djangoでのページヒットカウントのインクリメント
-
05-07-2019 - |
質問
IntegerField
( hit_count
)を持つテーブルがあり、ページにアクセスしたとき(たとえば、 http:// site / page / 3
)データベースのレコードID 3の hit_count
列を1ずつ増やしたい
クエリは次のようになります:
update table set hit_count = hit_count + 1 where id = 3
これを標準のDjangoモデル規約で実行できますか?または、クエリを手動で書く必要がありますか?
解決
Django 1.1+を使用している場合は、 F式:
from django.db.models import F
...
MyModel.objects.filter(id=...).update(hit_count=F('hit_count')+1)
これにより、単一のアトミックデータベースクエリが実行されます。
gerdembが言うように、これをミドルウェアに入れて簡単に再利用できるようにして、すべてのビューが乱雑にならないようにする必要があります。
他のヒント
gerdembが言うように、それをミドルウェアに書き込んで本当に再利用可能にする必要があります。または(簡単な)関数デコレータを作成します。実際、デコレーターとしてミドルウェアを使用するアダプターがあり、その逆もあります。
しかし、パフォーマンスが心配で、ページあたりのDBクエリを低く抑えたい場合は、memcachedのアトミックインクリメント操作を使用できます。もちろん、この場合、自分で永続性を管理する必要があります。
モデルの規則はアトミックではありません。手書きで書いてください:
BEGIN
SELECT * FROM table WHERE id=3 FOR UPDATE
UPDATE table SET hit_count=hit_count+1 WHERE id=3
COMMIT
ミドルウェア。アトミックトランザクションの欠如に関するIgnacioのコメントは真実ですが、これはDjangoフレームワーク全体の問題です。 100%正確なカウンターを持っていることを心配しない限り、私はそれについて心配しません。
所属していません StackOverflow