Django RetrieveAPIView中更新消息已读状态的合适位置
解决方案
首先明确:不建议在序列化器中实现修改已读状态的逻辑,序列化器的核心职责是数据的序列化/反序列化,把数据库状态修改放在这里会违反单一职责原则,还可能导致逻辑复用时的意外问题。
最直接且规范的实现方式是重写RetrieveAPIView的retrieve方法,在获取对象后、返回响应前更新已读状态:
from django.utils import timezone from rest_framework.response import Response from rest_framework import generics from rest_framework.permissions import IsAuthenticated class MessageDetail(generics.RetrieveAPIView): serializer_class = MessageSerializer permission_classes = [IsAuthenticated] queryset = AppUserMessage.objects.all() def retrieve(self, request, *args, **kwargs): # 获取目标消息对象 instance = self.get_object() # 仅当未标记为已读时更新,避免重复操作 if not instance.read_at: instance.read_at = timezone.now() instance.save() # 序列化对象并返回响应 serializer = self.get_serializer(instance) return Response(serializer.data)
补充说明
如果你的项目中有多个视图需要实现“获取即标记已读”的逻辑,也可以考虑使用DRF的信号(比如post_retrieve)来抽离公共逻辑,但对于单个视图来说,直接重写retrieve方法更直观、易维护。
内容的提问来源于stack exchange,提问作者Maya Amor
相关产品推荐
相关产品推荐

