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

使用Django Rest Framework创建详情视图时遇404 Not Found错误

排查DRF详情视图404问题的常见方案

看起来你在使用Django Rest Framework配置详情视图时遇到了404问题,我来帮你梳理最可能的几个原因和解决办法:

1. URL路由配置错误

这是最常见的诱因。你需要确保详情视图的URL模式正确捕获ID参数,并且和视图类的lookup_field匹配。

正确的URL配置示例:

from django.urls import path
from . import views

urlpatterns = [
    path('api/bios/', views.BioListView.as_view(), name='bio-list'),
    # 注意<int:pk>的参数名要和视图的lookup_field对应
    path('api/bios/<int:pk>/', views.BioDetailView.as_view(), name='bio-detail'),
]

如果你的模型主键不是默认的pk(比如用user_id作为主键),需要在视图类里显式指定lookup_field:

from rest_framework.generics import RetrieveAPIView
from .models import Bio
from .serializers import BioSerializer

class BioDetailView(RetrieveAPIView):
    queryset = Bio.objects.all()
    serializer_class = BioSerializer
    lookup_field = 'user_id'  # 替换为你模型的主键字段名

同时URL要同步修改为path('api/bios/<int:user_id>/', ...)

2. 查询集被错误过滤

有时候URL配置正确,但视图的queryset被过滤后不包含你要访问的ID对象。比如自定义get_queryset()时不小心做了范围限制:

class BioDetailView(RetrieveAPIView):
    serializer_class = BioSerializer
    
    def get_queryset(self):
        # 若这里只返回当前用户的数据,访问其他用户ID就会404
        return Bio.objects.filter(user=self.request.user)

检查你的queryset或get_queryset()方法,确保它包含目标ID的对象。

3. 视图类选择错误

如果用ListAPIView来处理详情请求,肯定会出问题——它只支持列表查询,不处理单个对象的请求。详情视图应该使用RetrieveAPIView、RetrieveUpdateDestroyAPIView或自定义支持单个对象查询的视图类:

# 列表视图(正确)
from rest_framework.generics import ListAPIView
class BioListView(ListAPIView):
    queryset = Bio.objects.all()
    serializer_class = BioSerializer

# 详情视图(正确)
from rest_framework.generics import RetrieveAPIView
class BioDetailView(RetrieveAPIView):
    queryset = Bio.objects.all()
    serializer_class = BioSerializer

4. 主键类型不匹配

如果模型主键是字符串类型(如UUID、Slug),但URL用了<int:pk>,会导致匹配失败返回404。比如模型用UUID做主键:

from django.db import models
import uuid

class Bio(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # 其他字段

对应的URL要修改为:

path('api/bios/<uuid:pk>/', views.BioDetailView.as_view(), name='bio-detail'),

快速验证步骤

  1. 先在Django Shell里确认对象存在:Bio.objects.get(pk=你访问的ID),如果这一步报错,说明数据库确实没有该对象,404是正常的。
  2. 检查URL顺序:确保详情视图的URL在列表视图之后(Django按顺序匹配URL,虽然列表视图是api/bios/带斜杠,顺序影响不大,但还是要避免冲突)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:26