如何重写DjangoRestFramework的ModelViewSet get方法添加前置逻辑
重写AccountViewSet以添加单个账户获取前的自定义逻辑
在Django REST Framework的ModelViewSet中,获取单个资源(比如/api/accounts/8)的逻辑对应retrieve方法,而非直接重写get方法(get会同时处理列表和详情两种请求)。推荐重写retrieve方法来精准添加自定义逻辑:
代码示例
class AccountViewSet(viewsets.ModelViewSet): """ A simple ViewSet for viewing and editing accounts. """ queryset = Account.objects.all() serializer_class = AccountSerializer permission_classes = [IsAccountAdminOrReadOnly] def retrieve(self, request, *args, **kwargs): # 这里添加你的自定义逻辑,比如: account_id = kwargs.get('pk') # 示例:记录访问日志 print(f"用户{request.user}正在访问ID为{account_id}的账户") # 示例:检查账户状态 account = self.get_object() if account.status == 'inactive': return Response({"error": "账户已禁用"}, status=status.HTTP_403_FORBIDDEN) # 执行默认的获取逻辑 return super().retrieve(request, *args, **kwargs)
说明
- 当访问
/api/accounts/8时,DRF会触发retrieve方法,kwargs['pk']即为目标账户的ID(此处是8)。 - 你可以在调用
super().retrieve()之前,执行任何自定义操作:记录日志、验证额外权限、修改资源状态、触发业务事件等。 - 如果非要重写
get方法,需要先判断是否为详情请求(存在pk参数),但这种方式会影响列表请求的逻辑,不推荐:
def get(self, request, *args, **kwargs): if 'pk' in kwargs: # 针对单个账户的自定义逻辑 print(f"处理详情请求,账户ID: {kwargs['pk']}") return super().get(request, *args, **kwargs)
内容的提问来源于stack exchange,提问作者BoumTAC
相关产品推荐
相关产品推荐

