Domanda

Ho una tabella con un IntegerField ( hit_count ) e quando viene visitata una pagina (ad esempio, http: // site / page / 3 ) Voglio che la colonna hit_count dell'ID record nel database aumenti di 1.

La query dovrebbe essere come:

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

Posso farlo con le convenzioni standard di Django Model? O dovrei semplicemente scrivere la query a mano?

È stato utile?

Soluzione

Se usi Django 1.1+, usa espressioni F :

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

Questo eseguirà una singola query atomica sul database.

Come dice gerdemb, dovresti considerare di metterlo in un middleware per renderlo facilmente riutilizzabile in modo da non ingombrare tutte le tue visualizzazioni.


Altri suggerimenti

Come dice gerdemb, dovresti scriverlo in un middleware per renderlo davvero riutilizzabile. O (più semplice) scrivere un decoratore di funzioni. In effetti, ci sono adattatori per usare un middleware come decoratore e viceversa.

Ma se sei preoccupato per le prestazioni e vuoi mantenere basse le query DB per pagina, puoi usare l'operazione di incremento atomico di memcached. ovviamente, in questo caso, devi prenderti cura della persistenza da solo.

Le convenzioni del modello non saranno atomiche; scrivilo a mano:

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

Vorrei iniziare guardando la documentazione per middleware . Il commento di Ignacio sulla mancanza di transazioni atomiche è vero, ma questo è un problema con l'intero framework Django. A meno che tu non sia preoccupato di avere un contatore preciso al 100%, non me ne preoccuperei.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top