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

Django中如何通过URL携带的宝可梦名称参数查询返回对应特定数据

实现方案

1. 修改路由配置,添加URL路径参数

你需要在应用对应的urls.py文件中,给接口路由配置命名参数,用来接收URL中传入的宝可梦名称:

from django.urls import path
from . import views

urlpatterns = [
    # 带宝可梦名称参数的路由,参数名需要和后续视图接收的参数保持一致
    path('pokemon/<str:pokemon_name>/', views.PokemonView.as_view(), name='pokemon-detail'),
    # 若还需要保留原全量查询接口,可以保留下面这条路由配置
    path('pokemon/', views.PokemonView.as_view(), name='pokemon-list'),
]

2. 调整视图逻辑,实现单条数据查询

修改PokemonView的get方法,接收路由传入的名称参数,替换原全量查询逻辑,同时添加异常处理避免宝可梦名称不存在时直接抛出500错误:

from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Pokemon
from .serializers import PokemonSerializer

class PokemonView(APIView):
    """Pokemon API View"""

    # 给get方法添加可选参数pokemon_name,默认值设为None适配全量查询场景
    def get(self, request, pokemon_name=None):
        """Returns the pokemon information"""
        if pokemon_name:
            # name__iexact 为不区分大小写匹配,不需要可以直接替换为name=pokemon_name
            pokemon_info = get_object_or_404(Pokemon, name__iexact=pokemon_name)
            # 单条数据序列化不需要加many=True参数
            serializer = PokemonSerializer(pokemon_info)
        # 不需要保留全量查询功能的话可以删掉else分支
        else:
            pokemon_info = Pokemon.objects.all()
            serializer = PokemonSerializer(pokemon_info, many=True)
        return Response(serializer.data)

你当前的PokemonSerializer无需做任何修改,可直接适配单条/多条数据的序列化逻辑。

可选优化说明

  • 如果宝可梦名称存在空格、特殊符号的场景,可以把路由参数类型从<str:pokemon_name>改成<path:pokemon_name>,支持匹配包含斜杠在内的特殊字符
  • 不需要保留全量查询接口的话,直接删掉路由中不带参数的配置、以及视图中else分支的全量查询逻辑即可

内容的提问来源于stack exchange,提问作者Perse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:45:03