You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django REST Framework视图中适配编程式缓存方案?

适配手动缓存到DRF ListAPIView的实现

当然可以把这种手动操作缓存的方式适配到DRF的ListAPIView中,下面是修改后的完整代码,同时修正原示例里的一处小错误(序列化器的model字段写错了,应该是Item而非Pair):

修改后的完整代码

# 导入需要的缓存模块
from django.core.cache import cache
from django.conf import settings
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from rest_framework import generics, serializers
from rest_framework.response import Response
from .models import Item

# 修正后的序列化器
class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item  # 原示例里写成了Pair,这里修正
        fields = '__all__'

# 整合缓存逻辑的视图
class ItemsList(generics.ListAPIView):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer
    
    # 配置缓存超时时间,优先读取settings里的配置,默认用全局默认值
    CACHE_TTL = getattr(settings, 'CACHE_TTL', DEFAULT_TIMEOUT)
    # 定义缓存键,可根据需求调整(比如加入请求参数区分不同缓存)
    CACHE_KEY = 'items_list_all'

    def list(self, request):
        # 先检查缓存中是否存在数据
        cached_data = cache.get(self.CACHE_KEY)
        if cached_data:
            return Response(cached_data)
        
        # 缓存不存在时,执行原有的查询和序列化逻辑
        queryset = self.get_queryset()
        serializer = ItemSerializer(queryset, many=True)
        response_data = serializer.data
        
        # 将序列化后的数据存入缓存,设置超时时间
        cache.set(self.CACHE_KEY, response_data, timeout=self.CACHE_TTL)
        
        return Response(response_data)

关键说明

  • 缓存键的灵活性:如果你的接口需要支持过滤、分页等参数,建议把请求的关键参数(比如request.query_params的哈希值)加入缓存键,避免不同参数的请求共用同一份缓存。比如可以改成:
    import hashlib
    query_str = request.GET.urlencode()
    cache_key = f'items_list_{hashlib.md5(query_str.encode()).hexdigest()}'
    
  • 缓存失效处理:如果Item模型的数据有更新(新增、修改、删除),需要手动清除对应的缓存键,否则用户会看到旧数据。可以通过Django信号(django.db.models.signals)实现自动清除,比如在post_save和post_delete信号中调用cache.delete(self.CACHE_KEY)。
  • 超时时间配置:可以在项目的settings.py中添加CACHE_TTL来统一设置缓存时长,比如CACHE_TTL = 60 * 15(15分钟)。

内容的提问来源于stack exchange,提问作者user840718

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:50:18