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

Django REST Framework中如何通过URL查询参数(如?uid=123)获取指定用户对象?

Django REST Framework中如何通过URL查询参数(如?uid=123)获取指定用户对象?

嗨,我完全懂你的感受——DRF自带的lookup_field和lookup_url_kwarg确实只对URL路径参数(比如/api/users/123/)生效,换成查询参数?uid=123就有点“水土不服”了,你之前写的重写get_object的方法虽然能用,但确实不够优雅。这里有几个更顺手的方案可以试试:

方案一:简化版重写get_object

不用绕弯子更新self.kwargs,直接通过查询参数查询对象,代码更直观:

from django.http import Http404
from rest_framework.generics import RetrieveUpdateDestroyAPIView, CreateAPIView
from .models import User
from .serializers import UserSerializer

class UserAPIView(RetrieveUpdateDestroyAPIView, CreateAPIView):
    serializer_class = UserSerializer
    queryset = User.objects.all()

    def get_object(self) -> User:
        uid = self.request.query_params.get('uid')
        # 校验参数格式
        if not uid or not uid.isdigit():
            raise Http404("无效的用户ID参数")
        
        try:
            return self.queryset.get(pk=int(uid))
        except User.DoesNotExist:
            raise Http404("未找到指定用户")

方案二:封装可复用的Mixin

如果多个视图都需要通过查询参数获取对象,可以写一个通用Mixin,避免重复代码:

from django.http import Http404

class QueryParamLookupMixin:
    # 可以在视图中自定义查询参数名,默认用uid
    lookup_query_param = 'uid'

    def get_object(self):
        param_value = self.request.query_params.get(self.lookup_query_param)
        if not param_value or not param_value.isdigit():
            raise Http404(f"无效的{self.lookup_query_param}参数")
        
        try:
            return self.queryset.get(pk=int(param_value))
        except self.queryset.model.DoesNotExist:
            raise Http404(f"未找到指定对象")

# 视图继承这个Mixin即可
class UserAPIView(QueryParamLookupMixin, RetrieveUpdateDestroyAPIView, CreateAPIView):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    # 如果需要换参数名,比如用user_id,直接指定即可
    # lookup_query_param = 'user_id'

补充说明

你对lookup_field和lookup_url_kwarg的理解完全正确——这两个属性是为URL路径参数设计的,DRF会自动从URL配置里提取对应参数值来查询对象,确实不适用于查询参数的场景。

另外提个小建议:你的视图同时继承了RetrieveUpdateDestroyAPIView和CreateAPIView,其实可以直接用ModelViewSet来简化,它已经包含了这些CRUD操作的逻辑~

备注:内容来源于stack exchange,提问作者Doule_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:12:58