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

如何重写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:25:26