2010-06-21 4 views
1

발췌문 그것은 미들웨어에 넣어 제안했다 this question어디에서이 히트 카운터 증분 코드를 배치합니까?

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

에서 가져온 나는 middleware에 조금을 읽을 수는 있지만 누군가가이 상황에서 어떻게 할 것인지 지적 할 수 있다면 매우 감사하겠습니다. 예를 들어 내 Bug 모델을 사용하면 고유 한 슬러그 필드와 pk가 있습니다.

여기 내 모델의 :

class Bug(models.Model): 
    name = models.CharField(max_length=100) 
    slug = models.SlugField(unique=True) 
    excerpt = models.TextField() 
    excerpt_markdown = models.TextField(editable=False, blank=True) 
    summary = models.TextField() 
    summary_markdown = models.TextField(editable=False, blank=True) 
    #workaround = models.TextField() 
    #workaround_markdown = models.TextField(editable=False, blank=True) 
    date_added = models.DateTimeField() 
    poster = models.ForeignKey(User) 
    tags_string = TagField() 

    class Meta: 
    ordering = ['name'] 

    def __unicode__(self): 
    return self.name 

    def get_absolute_url(self): 
    return '/bugs/%s/' % self.slug 

    def save(self, force_insert=False, force_update=False): 
    self.summary_markdown = markdown( self.summary ) 
    self.excerpt_markdown = markdown (self.excerpt) 
    #self.workaround_markdown = markdown( self.workaround) 
    super(Bug, self).save(force_insert, force_update) 

링크 /bugs/(slug)을 통해 볼 수 있습니다. 나는 새 열을 추가 아직했습니다하지만 난 당신이 세 가지 옵션이 그냥 내가 장식 내 퍼팅이 모델

답변

3

에 액세스하는 모든 견해를 장식 선호 hit_counter = models.IntegerField()

+0

옵션 3은 템플릿이 캐시되기 때문에 목적에 적합하지 않습니다. 코드는 BugManager 클래스에 있어야하지만보기 주위의 장식 자나보기 시작 부분에있을 수 있습니다. – rewritten

0

상상 :

  1. 미들웨어에 코드를 두어 템플릿에서 RequestContext를 통해 보편적으로 사용할 수 있도록합니다.

  2. 코드를 데코레이터 (기본적으로 다른 함수를 래핑하고 일부 기능을 추가하는 파이썬 함수)에 두어이 "히트 카운팅"코드를 적용 할 위치를 결정할 수 있습니다.

  3. 태그가 렌더링 된 템플릿을 만들 때마다 카운터를 증가시키는 사용자 정의 템플릿 태그에 코드를 삽입하십시오.

옵션 3 (템플릿 태그)은 가장 복잡하지만 카운터를 렌더링하고 단일 코드로 증가시킬 수 있으므로 실제 목적에 가장 적합합니다. 옵션 1 (미들웨어)이 가장 쉽고 유연하지만 재사용이 가장 쉽습니다.

미들웨어 및 템플릿 태그는 모두 장고의 문서에 잘 설명되어 있습니다. 그래서 여기에 코드 스 니펫을 넘겨주는 것보다 더 많은 작업을 할 수 있습니다.

데코레이터는 v2.4부터 파이썬의 기본 부분으로 학습 가치가 있지만 여기에서 선택하는 해결책은 아닙니다. 그들은 강력한 도구이며 Google 검색 (또는 SO 검색)은 수많은 정보를 제공합니다.

+0

데코레이터에 대해 이야기 할 때 당신이 말하는 것에 대해 확실하지 않습니다. 예를 들어 줄 수 있습니까? –

1

사용자가 모델을 볼 때마다 모델을 저장하면 모델이 모든 캐시보다 더 신선하므로 대부분의 캐시를 무의미하게 렌더링합니다.

중요한 점이 있다면 캐싱을 유지하는 접근법을 고려할 수 있습니다. 예를 들어, 모든보기에서 별도의 조회 모델을 업데이트 한 다음 캐시 친화적 인 간격으로 조회수를 기본 모델로 다시 축소 할 수 있습니다 .