문제

나는 an이있는 테이블이있다 IntegerField (hit_count), 페이지가 방문 될 때 (예 : http://site/page/3) 레코드 ID 3을 원합니다 hit_count 데이터베이스의 열이 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가 말했듯이, 당신은 그것을 실제로 재사용 할 수 있도록 미들웨어에 그것을 작성해야합니다. 또는 (간단한) 기능 데코레이터를 작성하십시오. 실제로, 미들웨어를 데코레이터로 사용하고 그 반대로 사용하는 어댑터가 있습니다.

그러나 성능이 걱정되고 페이지 당 DB 쿼리를 낮게 누르고 싶다면 Memcached의 원자 증분 작업을 사용할 수 있습니다. 물론,이 경우, 당신은 지속성을 스스로 돌봐야합니다.

모델 컨벤션은 원자가되지 않습니다. 직접 작성하십시오.

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

나는 문서를 보면서 시작할 것입니다 미들웨어. 원자 거래의 부족에 대한 Ignacio의 의견은 사실이지만 이것은 전체 Django 프레임 워크의 문제입니다. 100% 정확한 카운터를 갖는 것이 걱정되지 않는 한 나는 그것에 대해 걱정하지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top