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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top