无法迭代 Django 中缓存查询集的结果
Can not iterate over results of a cached queryset in Django
我想只缓存每篇文章的评论部分而不缓存整个页面,所以文章浏览量,我有
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()
您似乎在使用文章 slug 作为 get/set 缓存中评论的关键。我想在其他地方,在您未显示的代码中,您正在使用相同的密钥来缓存实际的文章(这是有道理的),这就是您在此代码中检索的内容。
您可能希望使用 "comments:%s" % post_slug
作为缓存键来消除它们的歧义。
我想只缓存每篇文章的评论部分而不缓存整个页面,所以文章浏览量,我有
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()
您似乎在使用文章 slug 作为 get/set 缓存中评论的关键。我想在其他地方,在您未显示的代码中,您正在使用相同的密钥来缓存实际的文章(这是有道理的),这就是您在此代码中检索的内容。
您可能希望使用 "comments:%s" % post_slug
作为缓存键来消除它们的歧义。