Incremento página Hit Conde em Django

votos
16

Eu tenho uma tabela com um IntegerField( hit_count), e quando uma página é visitada (por exemplo, http://site/page/3) Pedir registro ID 3 da hit_countcoluna no banco de dados para incrementar em 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?

Publicado 07/03/2009 em 23:42
fonte usuário
Em outras línguas...                            


4 respostas

votos
31

Se você usar Django 1.1+, basta usar 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.


Respondeu 08/03/2009 em 17:46
fonte usuário

votos
4

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 se você está preocupado com o desempenho e quer manter as consultas DB por página bater baixo, você pode usar da operação de incremento atômica memcached. é claro que, neste caso, você tem que cuidar de persistência si mesmo.

Respondeu 08/03/2009 em 02:24
fonte usuário

votos
0

Gostaria de começar por olhar para a documentação do 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á preocupado em ter um contador de 100% exato eu não me preocuparia com isso.

Respondeu 08/03/2009 em 01:04
fonte usuário

votos
0

As convenções modelo 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
Respondeu 07/03/2009 em 23:59
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more