我正在尝试缓存对 Django 配置文件对象的访问。我正在使用 django-redis-cache 来缓存这个项目中的数据。如果不存在,我正在使用一个片段来自动创建一个配置文件。这是我正在做的事情的简化版本(没有缓存):
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
每当需要配置文件信息时,都会访问 user.profile 属性。这可以按预期工作,但是,当我尝试缓存配置文件属性时,例如在图表 1 中,我仍然看到 SQL 查询(在 django-debug-toolbar 中)正在选择配置文件并且没有利用缓存。
具体来说,图表 2 中的 cache_object_list() 函数是一段代码,用于检查缓存值是否可用。如果是,则调用缓存键。如果没有,它会运行传递给它的查询(通过“查询”参数)并缓存结果。
cache_object_list() 打印“Hit”或“Miss”,表示缓存命中或未命中。刷新两次后,所有内容都被报告为命中(如预期的那样)。但是,django-debug-toolbar 仍然显示查询计数没有减少,并显示选择配置文件的查询。
有人对如何确保 user.profile 在可用时提取配置文件的缓存版本有任何建议吗?谢谢阅读。
图表 1:myproject/myapp/models.py
def get_or_create_profile(u):
return cache_utils.cache_single_object(
"user_get_or_create_profile",
u.id, UserProfile.objects.get_or_create(user=u)[0])
User.profile = property(lambda u: cache_utils.cache_single_object(
"user_get_or_create_profile", u.id,
get_or_create_profile(u)))
图表 2:myproject/cache_utils.py
def cache_single_object(key_prefix, id, query, timeout=500):
key = '%s_%s' % (key_prefix, id)
object_list = cache.get(key, None)
if object_list is None:
print "Miss %s" % (key)
object_list = query
cache.set(key, object_list, timeout)
else:
print "Hit %s" % (key)
return object_list
图表 3:myproject/templates/mytemplate.py
<div>Example of what's in the template </div>
{{ myobject.owner.profile.bio }}