Incremento página Hit Conde em Django
-
05-07-2019 - |
Pergunta
Eu tenho uma tabela com uma IntegerField
(hit_count
), e quando uma página é visitada (por exemplo, http://site/page/3
) Pedir registro coluna ID 3 de hit_count
no banco de dados para incremento de 1.
A consulta deve ser como:
update table set hit_count = hit_count + 1 where id = 3
Posso fazer isso com as convenções padrão Django modelo? Ou devo apenas escrever a consulta à mão?
Solução
Se você usar Django 1.1+, use apenas expressões F :
from django.db.models import F
...
MyModel.objects.filter(id=...).update(hit_count=F('hit_count')+1)
Isso irá executar uma única consulta de banco de dados atômica.
Como gerdemb diz, você deve considerar colocar isso em um middleware para torná-lo facilmente reutilizáveis ??para que não fiquem amontoados todos os seus pontos de vista.
Outras dicas
Como gerdemb diz, você deve escrevê-lo em um middleware para torná-lo realmente reutilizável. Ou (mais simples) escrever uma função decorador. Na verdade, há adaptadores para usar um middleware como um decorador e vice-versa.
Mas operação de incremento atômica se você está preocupado com o desempenho e quer manter as consultas DB por página hit baixo, você pode usar o memcached. é claro que, neste caso, você tem que cuidar de persistência si mesmo.
Os modelos de convenção não será atômica; escrever à mão:
BEGIN
SELECT * FROM table WHERE id=3 FOR UPDATE
UPDATE table SET hit_count=hit_count+1 WHERE id=3
COMMIT
Gostaria de começar por olhar para a documentação para middleware . O comentário de Ignacio sobre a falta de transações atômicas é verdade, mas este é um problema de todo o quadro Django. A menos que você está interessado em ter um contador de 100% exato eu não me preocuparia com isso.