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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:31:15