Frage

Ich habe eine Tabelle mit einem IntegerField (hit_count), und wenn eine Seite besucht wird (zum Beispiel http://site/page/3) Ich mag Spalte Datensatz-ID 3 des hit_count in der Datenbank um 1 zu erhöhen.

Die Abfrage sollte wie:

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

Kann ich das mit den Standard-Konventionen Django Modell? Oder sollte ich nur die Abfrage von Hand schreiben?

War es hilfreich?

Lösung

Wenn Sie Django 1.1+ verwenden, benutzen Sie einfach F Ausdrücke :

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

Dies wird eine einzige atomare Datenbankabfrage durchführt.

Wie gerdemb sagt, sollen Sie in einer Middleware setzen diese betrachten, um es wiederverwendbar leicht zu machen, damit es nicht alle Ihre Ansichten nicht vollstopfen.


Andere Tipps

Wie gerdemb sagt, können Sie es in eine Middleware schreiben sollte es wirklich wiederverwendbar zu machen. Oder (einfacher) eine Funktion Dekorateur schreiben. In der Tat gibt es Adapter eine Middleware als Dekorateur und umgekehrt zu verwenden.

Wenn Sie aber über die Leistung besorgt sind und wollen die DB-Abfragen halten pro Seite niedrig treffen, können Sie Atom Inkrementbetrieb des Memcached verwenden. natürlich, in diesem Fall müssen Sie kümmern sich um Ausdauer nehmen selbst.

Die Modell Konventionen werden nicht atomar sein; schreiben Sie es von Hand:

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

Ich würde durch einen Blick auf die Dokumentation für Middleware . Ignacio Kommentar über den Mangel an atomaren Transaktionen ist wahr, aber dies ist ein Problem, mit dem gesamten Django-Framework. Es sei denn, Sie ich eine 100% genaue Zähler darüber, dass würde sich keine Sorgen darüber besorgt sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top