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()
答案 0 :(得分:3)
您有三种选择:
将代码放在中间件中,以便通过RequestContext在模板中普遍使用。
将代码放在装饰器中(实际上只是一个包装另一个函数并添加一些功能的python函数),以便您可以决定应用这个“命中计数”代码的位置。
< / LI>将代码放在自定义模板标记中,每次呈现带有标记的模板时,该标记都会递增计数器。
选项三(模板标签)是最复杂的,但最适合实际目的,因为它可以渲染计数器并在单个代码中增加它。选项1(中间件)是最简单的,但也是最不灵活/可重用的等等。
Django的文档中都记录了中间件和模板标签。通过它们可以获得更多的东西,而不是在SO上获取代码片段。
装饰器是自v2.4以来Python的基本组成部分,值得学习,但不是我在这里选择的解决方案。它们是一个强大的工具,谷歌搜索(甚至搜索SO)将为您提供大量的信息。
答案 1 :(得分:1)
值得指出的是,如果每次用户查看时都保存模型,这将使大多数缓存变得毫无意义,因为模型将比任何缓存更新鲜。
如果这对您很重要,您可能需要考虑一种保留缓存的方法 - 例如,在每个视图上更新单独的Hits模型,然后以缓存友好的间隔将这些命中计数折回到主模型中。
答案 2 :(得分:0)
我更喜欢将它放在装饰器中并装饰访问此模型的所有视图