1

摘自这个问题的片段

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

建议放入中间件,我阅读了一些关于中间件的内容,但如果有人能指出他们在这种情况下会做什么,将不胜感激。以我的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()

4

3 回答 3

3

你有三个选择:

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

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

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

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

中间件和模板标签都在 Django 的文档中有很好的记录。与在 SO 上获得代码片段相比,您从它们中获得的收益要多得多。

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

于 2010-06-21T07:49:18.407 回答
1

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

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

于 2010-06-21T14:11:11.910 回答
0

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

于 2010-06-21T06:56:53.877 回答