2015-11-25 3 views
0

Я хотел бы кэшировать только комментарии раздел каждой статьи без кэширования всей страницы, поэтому мнения в статье, у меня естьНе может перебирать результаты кэшированных QuerySet в 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() 
+0

Возможно, вам нужно будет увидеть больше кода. –

+0

@ C.B Я думаю, что я упомянул проблемный код. Представления отлично работают без кеша. Что, по-вашему, отсутствует? – Jand

+1

Если вы на самом деле указываете, что контекстная переменная 'comments' указывает на ваш запрос queryset. Прямо сейчас, похоже, что ваша переменная контекста комментариев указывает на объект статьи, а не на запрос запроса. –

ответ

1

Вы, кажется, использует статью слизняка в качестве ключа, чтобы получить/установить комментарии в кэше. Я предполагаю, что в другом месте, в коде, который вы не показывали, вы используете тот же ключ для кэширования фактической статьи (что будет иметь смысл), и именно это вы получаете в этом коде.

Возможно, вы захотите устранить их с помощью "comments:%s" % post_slug в качестве ключа кеша.

+0

Хорошо, как всегда. Ты легенда Даниила. Просто интересно, насколько безопасно/эффективно использовать хеш-ключ, вместо того, чтобы использовать «комментарии:% s»% post_slug как хеш-ключ? – Jand

+0

Я не должен так думать. Кэши обычно являются магазинами с ключевыми значениями, они позаботятся о сохранении ключа наиболее эффективным способом. –

+0

Хорошо, также я ценю, если вы видите это (как-то) релевантный вопрос: http://stackoverflow.com/questions/33749369/how-to-invalidate-cache-page-in-django – Jand