Django REST Framework如何用单个视图处理pk和slug两类不同路径参数
解决方法
调整视图类的get方法参数,将pk和slug均设置为默认值为None的可选参数,通过判断传入的参数类型选择对应查询条件即可,原有路由配置无需修改,同时可以完全复用后续的序列化、返回逻辑,精简重复代码。
修改后的views.py代码如下:
from django.http import Http404 from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from django.shortcuts import get_object_or_404 # 补充你原有的模型、序列化器导入 from .models import WatchItem from .serializers import WatchItemSerializer class WatchItemDetail(APIView): def get(self, request, pk=None, slug=None): # 匹配参数构造查询条件 if pk is not None: watch_item = get_object_or_404(WatchItem, pk=pk) elif slug is not None: watch_item = get_object_or_404(WatchItem, slug=slug) else: raise Http404 # 复用后续返回逻辑 watch_item_serializer = WatchItemSerializer(watch_item) return Response(watch_item_serializer.data, status=status.HTTP_200_OK)
如果想要进一步简化查询逻辑,也可以用字典解包的写法:
class WatchItemDetail(APIView): def get(self, request, pk=None, slug=None): filter_kwargs = {} if pk: filter_kwargs["pk"] = pk if slug: filter_kwargs["slug"] = slug if not filter_kwargs: raise Http404 watch_item = get_object_or_404(WatchItem, **filter_kwargs) watch_item_serializer = WatchItemSerializer(watch_item) return Response(watch_item_serializer.data, status=status.HTTP_200_OK)
内容的提问来源于stack exchange,提问作者Visrut
相关产品推荐
相关产品推荐

