Подтвердить что ты не робот

Увеличение количества посещений страниц в Django

У меня есть таблица с IntegerField (hit_count), и когда страница посещается (например, http://site/page/3), я хочу, чтобы столбец ID 3 hit_count в базе данных увеличивался на 1.

Запрос должен выглядеть так:

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

Могу ли я сделать это со стандартными соглашениями модели Django? Или я должен просто написать запрос вручную?

4b9b3361

Ответ 1

Если вы используете Django 1.1+, просто используйте выражения F:

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

Это приведет к выполнению одного запроса атомной базы данных.

Как говорит gerdemb, вы должны подумать о том, чтобы положить это в промежуточное программное обеспечение, чтобы сделать его легко повторно используемым, чтобы он не загромождал все ваши взгляды.


Ответ 2

Как говорит gerdemb, вы должны записать его в промежуточное программное обеспечение, чтобы сделать его действительно многоразовым. Или (проще) написать декоратор функции. Фактически, есть адаптеры для использования промежуточного программного обеспечения в качестве декоратора и наоборот.

Но если вы беспокоитесь о производительности и хотите, чтобы запросы БД на страницу попадали на низкую, вы можете использовать операцию атомного приращения memcached. конечно, в этом случае вы должны сами заботиться о настойчивости.

Ответ 3

Соглашения о моделях не будут атомарными; напишите его вручную:

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

Ответ 4

Я бы начал с рассмотрения документации middleware. Комментарий Игнасио об отсутствии атомных транзакций - это правда, но это проблема со всей картой Django. Если вы не обеспокоены наличием 100% точного счетчика, я бы не стал беспокоиться об этом.