在Django中,如何有效地加载和存储全局常量数据以进行缓存?

2 投票
2 回答
504 浏览
提问于 2025-04-16 13:16

你通常是怎么从数据库加载和存储数据到全局常量里的,以便在初始化时进行缓存的?这些全局常量在之后不会再改变。

你是直接在加载时查询数据库,然后把结果放到常量里,还是用某种懒加载的方式?

我想的代码大概是这样的:

SPECIAL_USER_GROUP = Group.objects.get(name='very special users')
OTHER_THING_THAT_DOESNT_CHANGE = SomeDbEnum.objects.filter(is_enabled=True)
# several more items like this

我在使用一个空的测试数据库进行测试时遇到了一些问题。如果把所有需要的数据放在固定数据里也是一种选择,但我想避免让每个测试都和不相关的数据耦合在一起。

那么下面的做法算不算好的风格呢?

@memoize
def get_special_user_group():
    return Group.objects.get(name='very special users')

还是说更倾向于使用一种通用的可重用机制呢?

2 个回答

0

一个选择是把所有需要的数据放在固定的文件里,

这个想法不错。

但我想避免让每个测试都和它们不需要的无关数据绑定在一起。

那就定义一些更小的固定数据。

如果需要,可以使用测试案例中的 setUp 方法来创建所需的数据库记录。

3

Django有一个缓存框架,你可以用它来加速你的应用。

http://docs.djangoproject.com/en/dev/topics/cache/

这个框架提供了一个低级别的缓存接口,可以满足你的需求。

from django.core.cache import cache
cache.set('my_key', 'hello, world!', 30)
cache.get('my_key')

使用它的话,你可以这样做:

if cache.get("key"):
    return cache.get("key")
else:
    value = some_expensive_operation()
    cache.set("key",value)
    return value

用这样的方式将来会给你更多的灵活性。

撰写回答