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

Django Rest Framework传Slug时触发@api_view AssertionError求助

解决DRF中URL传递slug时的AssertionError问题

错误原因

你遇到的AssertionError: @api_view expected a list of strings, received str,是因为@api_view装饰器要求传入HTTP请求方法的列表或元组,而你直接传了单个字符串'GET',不符合参数格式要求。

修复方案

1. 修正@api_view的参数格式

把views.py中的@api_view('GET')改为@api_view(['GET']),用列表包裹HTTP方法字符串:

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Blog
from .serializers import BlogSerializer
from django.shortcuts import get_object_or_404

@api_view(['GET'])
def blog(request):
    blog = Blog.objects.all()
    serializer = BlogSerializer(blog, many=True )
    return Response(serializer.data)

@api_view(['GET'])
def blogPost(request, slug):
    # 用get_object_or_404替代get,slug不存在时自动返回404响应
    blogpost = get_object_or_404(Blog, slug=slug)
    serializer = BlogSerializer(blogpost, many=False)
    return Response(serializer.data)

2. 优化URL路径转换器(可选)

在urls.py中,推荐使用Django专门的slug路径转换器代替str,更贴合slug字段的语义:

from django.urls import path
from . import views

urlpatterns = [
    path('blog/', views.blog, name='blog'),  # 末尾加/,保持URL规范
    path('blog/<slug:slug>/', views.blogPost, name='blogpost')
]

额外优化建议

  • 第一个blog视图必须加上@api_view(['GET'])装饰器,确保DRF的Response组件能正常工作,避免潜在兼容性问题。
  • 使用get_object_or_404替代直接调用Blog.objects.get(),无需手动捕获DoesNotExist异常,代码更简洁,返回的404响应也更符合REST规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:53:14