0

我想只缓存每篇文章的评论部分而不缓存整个页面,所以文章视图,我有

try:
    cmnts_key = post_slug
    comments = cache.get(cmnts_key)
    if not comments:
        comments = Comment.objects.filter(post=post).order_by("created")
        cache.set(cmnts_key, comments, COMMENTS_CACHE_TIMEOUT)
except: 
    print 'comments fetch exception'
    pass

...
args = {}
args['post'] = post
args['comments'] = comments
return render(request, "post.html", args)

但是在它尝试呈现评论的模板中,{% for comment in comments %}我得到:

'Article' object is not iterable.

我不知道是否基本上不可能迭代缓存的查询集结果,或者我的代码有问题,如果是,我该如何解决?

更新。这是我的评论模型:

class Comment(models.Model):
    author = models.ForeignKey(User)
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, default='', blank=True)
    body = models.TextField()
    post = models.ForeignKey(Article)
    published = models.BooleanField(default=True)


    def __unicode__(self):
        return unicode("%s: %s" % (self.post, self.body[:60]))

    def get_absolute_url(self):
        return "/article/"+ self.slug     

    def save(self, *args, **kwargs):
        self.title = comment_truncate(self.body)        
        super(Comment, self).save(*args, **kwargs)

    @property
    def cache_key(self):
        return self.get_absolute_url()
4

1 回答 1

1

您似乎正在使用文章 slug 作为获取/设置缓存中评论的关键。我猜在其他地方,在您没有显示的代码中,您正在使用相同的键来缓存实际的文章(这是有道理的),这就是您在此代码中检索的内容。

您可能希望通过"comments:%s" % post_slug用作缓存键来消除它们的歧义。

于 2015-11-25T20:03:42.230 回答