2010-06-21 99 views
1

段从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

意见您有三个选项:

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

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

  3. 放置在一个自定义模板标签中的代码,将每一个与标签模板渲染的时候增加计数器。

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

中间件和模板标签在Django的文档中都有很好的记录。通过它们,你会得到更多的工作,而不是在SO上拿到代码片段。

装饰是因为V2.4 Python中的一个基本组成部分,是值得学习的,而不是解决方案,我会选择这里。他们是一个强大的工具,Google搜索(甚至搜索SO)会为您提供大量信息。

+0

由于模板已被缓存,选项三并不适合此目的。 的代码应该住在BugManager类,但被摆放在你的视图或只是在视图的开始装饰大概叫。 – rewritten 2011-03-20 14:11:33

0

我更喜欢把它装饰内装潢所有访问该模型

+0

我不完全相信你说当你提到装饰什么 - 你可以提供一个例子吗? – 2010-06-21 07:14:44

1

可能值得指出的是,如果每次用户查看模型时都保存模型,这将导致大多数缓存没有意义,因为模型比任何缓存都更新鲜。

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