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

使用Django Rest Framework创建字符串列表接口遇404问题求助

问题排查与解决

一、404错误的核心原因:路由配置问题

你遇到的404错误和视图实现逻辑无关,大概率是路由的层级或导入配置出错,以下是具体排查点:

1. 主路由与子路由的层级匹配

检查项目根目录的urls.py是否正确包含了你的应用路由,并且前缀为api/。示例:

# 根urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('your_app_name.urls')),  # 必须添加这行,确保/api/前缀指向你的应用路由
]

只有根路由配置了api/前缀,你的应用urls.py里的path('artists/names/', ...)才能被/api/artists/names/正确匹配。

2. 视图函数的导入检查

确认应用urls.py中正确导入了artist_names视图:

# 应用urls.py
from django.urls import path
from . import views  # 或者 from .views import artist_names

urlpatterns = [
    path('artists/names/', views.artist_names, name='artist_names'),
]

仔细核对函数名拼写,避免大小写或单词错误导致无法找到视图。

3. 路由顺序冲突(低概率)

如果应用urls.py中有其他以artists/开头的动态路由(比如path('artists/<int:pk>/', ...)),请将artists/names/路由放在这类动态路由的前面。Django会按顺序匹配路由,若动态路由在前,names会被解析为pk参数,从而返回404。


二、视图实现的优化建议

你的第一种Python列表实现方式是正确的,能直接返回["50 Cent", "Eminem", ...]的预期格式。但第二种序列化方式存在逻辑错误,即使路由修复,也无法得到目标结果:

  • 你定义的ArtistNameSerializer将name字段设为列表,但传入的values_list('name', flat=True)是单个字符串的迭代器,加上many=True后,会返回[{"name": "50 Cent"}, {"name": "Eminem"}, ...]的格式,不符合需求。

如果想用序列化器实现正确格式,可以简化为:

# serializers.py
from rest_framework import serializers

class ArtistNameSerializer(serializers.Serializer):
    def to_representation(self, instance):
        # 直接返回单个name字符串
        return instance

视图中使用:

@api_view(['GET'])
def artist_names(request):
    artists = Artist.objects.values_list('name', flat=True)
    serializer = ArtistNameSerializer(artists, many=True)
    return Response(serializer.data)

不过这种方式不如第一种直接转列表高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:47:50