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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top