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

Django中如何配置urls.py并修改get方法处理/words/{id}请求

问题说明

已定义Word模型,需要修改views.py文件中WordView类的get方法,使其能够处理GET /words/{id}格式的请求,接口期望返回的响应示例如下:

{
    "id": 1,
    "name": "to ask out",
    "translation": "Пригласить на свидание",
    "transcription": "tuː ɑːsk aʊt",
    "example": "John has asked Mary out several times."
}

当前编写的get方法代码如下:

from django.views import View
from django.http import JsonResponse
from models import Word

class WordView(View):

    def get(self, request, id):     # 此处是否不需要传入`id`参数

        item = Word.objects.get(id=id)
        items_data = [{
            'id': item.id,
            'word': item.word,
            'transcription': item.transcription,
            'translation': item.translation,
            'example': item.example,
        }]

        return JsonResponse(items_data[0])

待解决两个问题:

  1. 如何修改urls.py文件,以匹配/words/{id}格式的请求路径?当前urls.py路由配置如下:
urlpatterns = [
    path('admin/', admin.site.urls),
    path('words/{id}', WordView.as_view()),
]
  1. 如何修改上述get方法,使其能够正确返回符合要求的响应数据?

解答

1. urls.py路由修改

Django的path路由不支持{id}这种占位符写法,需要使用Django内置的路径转换器语法,同时get方法中的id参数必须保留,路由匹配到的路径参数会自动作为关键字参数传入视图方法。

修改后的完整路由配置:

from django.contrib import admin
from django.urls import path
# 导入对应视图
from .views import WordView

urlpatterns = [
    path('admin/', admin.site.urls),
    # 使用<int:id>匹配整数类型的id参数,末尾加斜杠符合Django默认路由约定
    path('words/<int:id>/', WordView.as_view()),
]

如果不需要强制末尾斜杠,可以去掉路径末尾的/,但推荐保留以适配Django默认的APPEND_SLASH配置。

2. get方法修改

现有代码存在三个问题:一是返回字段名和接口要求不匹配,接口要求返回name字段,现有代码返回的是word字段;二是多余的列表包裹逻辑没有必要;三是没有处理单词不存在的异常场景,会触发500错误。

修改后的完整代码:

from django.views import View
from django.http import JsonResponse
from .models import Word  # 同应用下模型推荐使用相对导入,避免导包错误

class WordView(View):

    def get(self, request, id):
        # 查询对应id的单词,不存在则返回404
        try:
            item = Word.objects.get(id=id)
        except Word.DoesNotExist:
            return JsonResponse({"error": "resource not found"}, status=404)
        
        # 构造和接口要求对齐的返回数据
        resp_data = {
            'id': item.id,
            'name': item.word,
            'transcription': item.transcription,
            'translation': item.translation,
            'example': item.example,
        }

        return JsonResponse(resp_data)

修改点说明:

  • 保留get方法的id形参,用于接收路由传入的路径参数
  • 修正返回字段映射,将模型的word字段对应到接口要求的name键
  • 移除多余的列表包裹逻辑,直接传入字典给JsonResponse即可
  • 增加资源不存在的异常捕获,返回404状态码
  • 修正模型导入路径,避免跨路径导包错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:54:25