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

Django中<slug>路径转换器失效,URL字面<slug>却可正常访问

问题分析与修复方案

核心错误点

1. 路由注册逻辑错误

在urls2.py中,你把路径参数<slug>直接作为router.register的第一个前缀参数,导致DRF生成的路由是字面量匹配<slug>字符串,而非接受任意slug值的动态路径。这就是为什么访问http://127.0.0.1:8000/<slug>/能正常加载,而真实slug值(如slugtest)匹配不到的原因。

2. Serializer的lookup_field配置错误

serializer.py里的lookup_field被设置为列表['slug'],但DRF要求该参数必须是字符串类型,列表形式会导致序列化器无法正确识别查找字段。

3. ViewSet方法缩进错误

views.py中的get_queryset方法没有缩进在ArticleInfoViewSet类内部,变成了全局函数,导致ViewSet无法使用自定义的查询集逻辑。


修复代码

1. 修改urls2.py

将router.register的前缀设为空字符串,DRF会根据ViewSet的lookup_field自动生成动态路由:

from . import views
from rest_framework_nested import routers

router = routers.SimpleRouter()
# 前缀设为空,结合viewset的lookup_field='slug',自动生成/{slug}/的动态路由
router.register('', views.ArticleInfoViewSet, basename='article-info')
urlpatterns = router.urls

2. 修改serializer.py

将lookup_field改为字符串类型:

class ArticleInfoSerializer(serializers.ModelSerializer):
    data = ArticleDataSerializer(many=True)

    class Meta:
        model = Article
        fields = ['url', 'data', 'slug']
        lookup_field = 'slug'  # 修正为字符串
        read_only_fields = ['url', 'data', 'slug']

3. 修正views.py的缩进

把get_queryset方法缩进至ArticleInfoViewSet类内部:

class ArticleInfoViewSet(ModelViewSet):
    serializer_class = ArticleInfoSerializer
    lookup_url_kwarg = 'slug'
    lookup_field = 'slug'

    # 修正缩进,作为类的成员方法
    def get_queryset(self):
        queryset = Article.objects.prefetch_related('data')
        return queryset

验证修复

修复完成后,访问http://127.0.0.1:8000/slugtest/时,DRF会自动将slugtest作为slug参数传递给ViewSet,匹配对应的Article对象并返回数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:30:49