Incremento de conteo de páginas en Django
-
05-07-2019 - |
Pregunta
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 ID 3 del registro 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?
Solución
Si usa Django 1.1+, simplemente use expresiones F :
from django.db.models import F
...
MyModel.objects.filter(id=...).update(hit_count=F('hit_count')+1)
Esto realizará una única consulta de base de datos atómica.
Como dice Gerdemb, deberías considerar poner esto en un middleware para que sea fácilmente reutilizable para que no desordene todas tus vistas.
Otros consejos
Como dice Gerdemb, debes 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 está preocupado por el rendimiento y desea mantener bajas las consultas de base de datos por página, puede usar la operación de incremento atómico de memcached. por supuesto, en este caso, usted mismo debe cuidar la persistencia.
Las convenciones del 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
Comenzaría mirando la documentación de 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 esté preocupado por tener un contador 100% preciso, no me preocuparía por eso.