Вопрос

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

Запрос должен быть таким:

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

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

Это было полезно?

Решение

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

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

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

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

<Ч>

Другие советы

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

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

Типовые соглашения не будут атомарными; напишите это от руки:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top