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_
相关产品推荐
相关产品推荐

