【发布时间】:2016-07-06 10:54:38
【问题描述】:
我有一个模型Person,在那里我做了很多相同类型的查询。例如,我可能会多次询问同一页面中的“头像”。
正如你在我的代码中看到的,我已经实现了一种“排序”的缓存:将结果放入一个数组中,然后,如果这个数组中有一个键,则返回结果。
class Personne(BaseModel):
def __init__(self, *args, **kwargs):
# Mise en place de cache :
self.cache = {}
super(Personne, self).__init__(*args, **kwargs)
def url_profile_picture(self):
# gestion du cache :
retour = self.cache.get('profile_picture')
if retour:
return retour
a = PersonnePhoto.objects.filter(personne=self,
photo_type=PersonnePhoto.PHOTO_PROFIL)
if len(a):
a = reverse('url_public', kwargs={'path': a[0].photo})
else:
a = staticfiles.static('img/no-picture-yet.png')
self.cache['photo_profil'] = a
return a
我想知道(因为我是 Django 新手)如果 Django 已经拥有自己的缓存系统是否有用。我的意思是:我的查询PersonnePhoto.objects.filter(...)会一直访问数据库->我肯定需要自己的缓存,还是被Django缓存->没用自己写缓存方法?
【问题讨论】:
-
我看不出 Django 或任何软件组件如何缓存诸如此类的任意查询。没有办法判断
Personne的 URL 自上次读取后是否已更改,除非查询数据库。事实上,除非这个属性是只读的,否则你应该考虑你当前的缓存尝试在那种情况下是否会失效。 -
另一件要考虑的事情,假设这个模型与“personne”和存储的 FileField 相关,你可以简单地使用 ORM 来获取 url,它应该缓存结果以在单个页面上多次使用。但这将取决于您如何真正使用此属性(我们无法从发布的代码中看到)。
标签: python django caching django-models