Django:我需要制作一个缓存方法吗?

时间:2016-03-19 18:28:19

标签: python django caching django-models

我有一个模型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缓存 - >写我自己的缓存方法没用?

2 个答案:

答案 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/

编辑:然后在您的个人资料区域中,您可以在上传图片时清除缓存,以使其更快地显示。