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
相关产品推荐
相关产品推荐

