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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:39:03