我知道https://github.com/chibisov/drf-extensions,但构建失败了。
如何为通用视图缓存响应?例如:
class PropertyList(generics.ListAPIView):
queryset = Property.objects.all().prefetch_related("photos")
serializer_class = PropertyListSerializer
filter_backends = (filters.DjangoFilterBackend,)
filter_fields = ('featured', 'state', 'price_cents','location', 'status')
ordering_fields = ('expiration_date',)
从ListModelMixin实现list方法是唯一的选择吗?
答案 0 :(得分:1)
有一些解决方案:
您可以使用带有cache_page
或vary_on_cookie
之类的装饰器的APIview和ViewSet缓存。如下所示:
class UserViewSet(viewsets.Viewset):
# Cache requested url for each user for 2 hours
@method_decorator(cache_page(60*60*2))
@method_decorator(vary_on_cookie)
def list(self, request, format=None):
content = {
'user_feed': request.user.get_user_feed()
}
return Response(content)
您也可以按照自己的方式进行操作。我的意思是,您只能使用django中提供的缓存方法,例如cache.set
。例如,仅存储方法或查询的结果并存储将来的请求,您可以为它定义一个键,并用cache.set(cache_key, result, expire_time)
将该结果设置为该键,然后在需要时获取它。因此,只要该键可以使用缓存,就可以获取其他内容,然后再次从数据库中获取结果并再次存储。
顺便说一下,它几乎是this link on stackoverflow
请记住,您应该为结果定义一个缓存后端。默认情况下,您可以使用数据库后端在数据库或文件系统上使用键存储结果。但是,适当且更好的解决方案是根据需要使用消息代理,例如redis或memcached或...。
以下是一些其他有用的链接: