我有一个模型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缓存 - >写我自己的缓存方法没用?
答案 0 :(得分:1)
我认为您正在寻找the cached_property
decorator。它的行为与您为自己推出的解决方案完全相同(区别在于url_profile_picture
现在是属性):
from django.utils.functional import cached_property
class Personne(BaseModel):
@cached_property
def url_profile_picture(self):
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')
return a
答案 1 :(得分:1)
from django.core.cache import cache
在你的模型中,我建议这样的事情:
def url_profile_picture(self):
# gestion du cache :
retour = cache.get('profile_picture_%s' % self.pk)
if retour:
return retour
else:
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')
cache.set('profile_picture_%s' % self.pk, a)
return a
可以在这里阅读有关django缓存的更多信息:https://docs.djangoproject.com/en/1.9/topics/cache/
编辑:然后在您的个人资料区域中,您可以在上传图片时清除缓存,以使其更快地显示。