在我的django应用程序中,我有BlogEntry
属于Category
。BlogEntry
可能属于许多Category
s
class BlogEntry(models.Model):
creationdate=models.DateField(default=date.today)
description=models.TextField()
author=models.ForeignKey(User,null=True)
categories=models.ManyToManyField(Category)
class Category(models.Model):
name=models.CharField(unique=True,max_length=50)
description=models.TextField(blank=True)
用户可以修改BlogEntry
,这样做可能会删除它所在的Category
。
假设blogEntry1
之前属于java,scala
。如果用户对其进行了修改,则会删除scala
。现在该条目只有一个类别,即java
在我的list_view中,我使用缓存,如下所示
from django.core.cache import cache
def list_entries_on_day(request,year,month,day):
...
key = 'entries_day'+'-'+year+'-'+month+'-'+day
if key not in cache:
entries = BlogEntry.objects.filter(...args..)
cache.set(key,entries)
entries_on_day =cache.get(key)
...
假设我今天创建了2个条目并将它们放入缓存中。如果我编辑其中一个BlogEnty
并删除一个类别
即;
blogEntry1 has categories :java,scala
blogEntry2 has categories :dotnet,vbasic
最初我查询今天的条目并将结果放入缓存
缓存现在对密钥[blogEntry1,blogEntry2]
'entries_day-2012-11-11'
现在我修改blogEntry1
,使其现在有java
作为类别
,我是否需要从缓存中删除存储的条目?(因为缓存在修改之前包含BlogEntry
个对象)
答案 0 :(得分:1)
您可以通过注册model.save
的信号处理程序来使缓存无效您还可以看到用户将看到陈旧内容直到缓存过期(默认为1小时)这一事实,确保他登录用户不会看到缓存的内容,否则他将按喇叭编辑丢失。
嗯,我的回答有点模糊,但我只是想说:不,你不必严格要求在每次编辑时使缓存无效,这是性能和内容新鲜度之间的选择。
还有一个问题:缓存使用的首选习惯用语是:
entries_on_day = cache.get(key)
if entries_on_day is None:
entries_on_day = BlogEntry.objects.filter(...args..)
cache.set(key,entries_on_day)
您保存一个缓存查询