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.