我在哪里放置这个命中计数器增量代码?

时间:2010-06-21 03:04:42

标签: django middleware

摘自this question

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

有人建议放入中间件,我在middleware上读了一下,但如果有人能指出在这种情况下他们会做什么,我们将非常感激。以我的Bug模型为例,它有一个独特的slug字段和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)查看链接。我还没有添加新列,但我想它只是hit_counter = models.IntegerField()

3 个答案:

答案 0 :(得分:3)

您有三种选择:

  1. 将代码放在中间件中,以便通过RequestContext在模板中普遍使用。

  2. 将代码放在装饰器中(实际上只是一个包装另一个函数并添加一些功能的python函数),以便您可以决定应用这个“命中计数”代码的位置。

    < / LI>
  3. 将代码放在自定义模板标记中,每次呈现带有标记的模板时,该标记都会递增计数器。

  4. 选项三(模板标签)是最复杂的,但最适合实际目的,因为它可以渲染计数器并在单个代码中增加它。选项1(中间件)是最简单的,但也是最不灵活/可重用的等等。

    Django的文档中都记录了中间件和模板标签。通过它们可以获得更多的东西,而不是在SO上获取代码片段。

    装饰器是自v2.4以来Python的基本组成部分,值得学习,但不是我在这里选择的解决方案。它们是一个强大的工具,谷歌搜索(甚至搜索SO)将为您提供大量的信息。

答案 1 :(得分:1)

值得指出的是,如果每次用户查看时都保存模型,这将使​​大多数缓存变得毫无意义,因为模型将比任何缓存更新鲜。

如果这对您很重要,您可能需要考虑一种保留缓存的方法 - 例如,在每个视图上更新单独的Hits模型,然后以缓存友好的间隔将这些命中计数折回到主模型中。

答案 2 :(得分:0)

我更喜欢将它放在装饰器中并装饰访问此模型的所有视图