Python Django:我需要创建一个缓存方法吗?

Python Django:我需要创建一个缓存方法吗?,python,django,caching,django-models,Python,Django,Caching,Django Models,我有一个modelPerson,在那里我做了很多相同类型的查询。例如,我可能会多次询问同一页面中的“个人资料图片” 正如您在我的代码中看到的,我实现了一种“排序”缓存:将结果放入一个数组中,然后,如果该数组中有键,则返回结果 class Personne(BaseModel): def __init__(self, *args, **kwargs): # Mise en place de cache : self.cache = {} s

我有一个model
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已经有了自己的缓存系统,这是否有用。我的意思是:我的查询
personephoto.objects.filter(…)
是否会一直访问数据库->我肯定需要自己的缓存,还是会被Django缓存->写自己的缓存方法没有用?

我想你正在寻找。它的行为与您为自己推出的解决方案完全相同(区别在于
url\u profile\u picture
现在是一个属性):

在您的模型中,我建议如下:

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缓存的更多信息:


编辑:然后在您的配置文件区域中,您可以在上载图像时清除缓存,以使其更快地显示。

我看不出Django或任何软件组件如何缓存这样的任意查询。除了查询数据库外,无法判断自上次读取以来
人员的URL是否已更改。事实上,除非此属性是只读的,否则您应该考虑当前的缓存尝试是否会在该场景中无效。另一个要考虑的问题是,假设该模型与“人物”和存储的Fieldfield有关,您可以简单地使用ORM获取URL,并且它应该缓存结果以在单个页面上多次使用。但这将取决于您如何真正使用此属性(我们无法从发布的代码中看到)。我认为此缓存将存在很短的时间,并且不会提供任何真正的好处(只与对象存在的时间一样长,这对于单页加载来说是很好的,并且可能无论如何都不需要它)。我将添加一个sudo代码解决方案used@warath-编码器在这一点上我完全不同意你。OP显示的解决方案具有相同的属性(只与对象存在的时间相同),并且他不要求更改该属性,但前提是Django已经涵盖了该属性,而且确实如此,只要使用
@cached_属性
装饰器。他还明确表示,“我可能会多次询问同一页面中的“配置文件图片”,这正是创建
@cached_property
的使用案例,在这种情况下它提供了真正的好处。当然。。。当您有1000多个页面加载时,您将有1000多个对数据库的调用。所以,正如我所说的,对于单页面加载来说,这是正确的,这将很好地工作,但在高容量的网站上,它不会。哦,来吧。我使用不同类型的缓存,因为它们是需要的。这很明显,不是吗?我相信您并不是建议您需要对所有内容使用外部缓存。在这个问题中,我看不到OP正在寻找(或特别需要)外部缓存的迹象。
@cached_property
是Django的一部分,因为当一个请求中需要多次调用同一方法时,它非常有用。OP表示这正是他正在做的,他推出了自己的解决方案,其行为与
@cached\u property
完全相同。OP询问这种缓存是否内置在Django中。答案是肯定的,有,它被称为
@cached_property
,但您需要启用它。这是对问题的直接回答,这正是我所说的。这对我来说是一个EOT。注意:如果您经常使用属性,我的解决方案将对缓存系统进行大量调用,因此对于如此小的值,Ludwi的答案可能更好。
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