如何在Django REST Framework接口被访问时自动增加浏览量计数
实现方法
你只需要修改views.py中的FeedDetail视图类即可,推荐使用Django的F表达式实现原子更新,避免高并发场景下浏览计数不准确的问题:
第一步:导入依赖
在views.py顶部添加导入:
from django.db.models import F from rest_framework.response import Response
第二步:重写视图逻辑
有两种可选的改写方式,效果一致:
方式1:重写retrieve方法
class FeedDetail(generics.RetrieveAPIView): queryset = Feed.objects.all() serializer_class = FeedSerializer def retrieve(self, request, *args, **kwargs): instance = self.get_object() # 原子更新浏览量 Feed.objects.filter(pk=instance.pk).update(view=F('view') + 1) # 刷新实例获取最新的浏览量数值返回给前端 instance.refresh_from_db() serializer = self.get_serializer(instance) return Response(serializer.data)
方式2:重写get_object方法(更简洁)
class FeedDetail(generics.RetrieveAPIView): queryset = Feed.objects.all() serializer_class = FeedSerializer def get_object(self): instance = super().get_object() Feed.objects.filter(pk=instance.pk).update(view=F('view') + 1) instance.refresh_from_db() return instance
注意说明
- 上述两种写法都会先执行DRF默认的权限、认证校验,只有校验通过的合法请求才会触发浏览量更新,不会出现未授权访问刷浏览量的问题
- 不要直接使用
instance.view += 1再调用save()的写法,这种方式在多并发场景下会出现计数丢失的问题,F表达式的更新操作在数据库层面执行,是原子操作,计数更准确
内容的提问来源于stack exchange,提问作者Andi Fathul Mukminin
相关产品推荐
相关产品推荐

