如何在Django REST Framework中获取数据后更新指定字段
实现文章详情页阅读量自动累加1的方案
你可以通过重写RetrieveUpdateAPIView的retrieve方法来实现需求,同时为避免并发场景下的计数错误,推荐使用Django的F()表达式做原子更新:
修改后的Views.py代码
from django.db.models import F from rest_framework import generics from .models import Article from .serializers import ArticleSerializer class ArticleDetail(generics.RetrieveUpdateAPIView): queryset = Article.objects.all() serializer_class = ArticleSerializer def retrieve(self, request, *args, **kwargs): # 获取目标文章实例 instance = self.get_object() # 原子操作更新阅读量:直接在数据库层面执行+1,避免并发冲突 Article.objects.filter(pk=instance.pk).update(view=F('view') + 1) # 刷新实例数据,确保返回的序列化结果包含最新阅读量 instance.refresh_from_db() # 调用父类方法完成序列化与响应返回 return super().retrieve(request, *args, **kwargs)
关键说明
F()表达式的优势:直接在数据库层面执行view = view + 1操作,属于原子性操作,多个请求同时访问时不会出现计数丢失的问题,比先取出实例修改instance.view +=1再save()的方式更安全。refresh_from_db()的作用:更新数据库后刷新实例,保证返回给前端的是最新的阅读量数值。
如果是低并发场景,也可以用更直观的写法(不推荐高并发环境):
def retrieve(self, request, *args, **kwargs): instance = self.get_object() instance.view += 1 instance.save(update_fields=['view']) # 仅更新view字段,提升性能 return super().retrieve(request, *args, **kwargs)
内容的提问来源于stack exchange,提问作者USER2022
相关产品推荐
相关产品推荐

