python django django-models

python - Incremento de conteo de páginas en Django



django-models (4)

Tengo una tabla con un IntegerField ( hit_count ), y cuando se visita una página (por ejemplo, http://site/page/3 ) Quiero que la columna hit_count del registro ID 3 en la base de datos se incremente en 1.

La consulta debe ser como:

update table set hit_count = hit_count + 1 where id = 3

¿Puedo hacer esto con las convenciones estándar del modelo Django? ¿O debería simplemente escribir la consulta a mano?


Como dice gerdemb, debe escribirlo en un middleware para hacerlo realmente reutilizable. O (más simple) escribir un decorador de funciones. De hecho, hay adaptadores para usar un middleware como decorador y viceversa.

Pero si le preocupa el rendimiento y desea mantener bajas las consultas de base de datos por página, puede utilizar la operación de incremento atómico de memcached. Por supuesto, en este caso, tienes que cuidar de la persistencia.


Empezaría mirando la documentación para middleware . El comentario de Ignacio sobre la falta de transacciones atómicas es cierto, pero este es un problema con todo el marco de Django. A menos que te preocupe tener un contador 100% preciso, no me preocuparía por eso.


Las convenciones modelo no serán atómicas; Escríbelo a mano:

BEGIN SELECT * FROM table WHERE id=3 FOR UPDATE UPDATE table SET hit_count=hit_count+1 WHERE id=3 COMMIT


Si usas Django 1.1+, solo usa expresiones F :

from django.db.models import F ... MyModel.objects.filter(id=...).update(hit_count=F(''hit_count'')+1)

Esto realizará una sola consulta de base de datos atómica.

Como dice gerdemb, debe considerar poner esto en un middleware para que sea fácilmente reutilizable para que no desordene todas sus vistas.