Django路由404问题:按用户ID过滤数据失败求助
解决Django路由404及按用户ID过滤Count数据的问题
先帮你拆解下问题根源,再一步步解决:
1. 路由404的直接原因
你用了path()函数搭配正则表达式语法,但Django的path()不支持正则,它只识别<转换器:变量名>这种格式的路径参数。如果要写正则路由,得用re_path()(也就是旧版的url()函数),或者改用Django内置的路径转换器。
修正路由的两种方式
方式一:用path()的路径转换器(推荐)
如果你的需求是通过URL路径传递用户ID(比如/count/1/):
from django.urls import path path('count/<int:pk>/', CountlListView.as_view()),
方式二:用re_path()支持正则
如果你习惯正则写法:
from django.urls import re_path re_path(r'^count/(?P<pk>[0-9]+)/$', CountlListView.as_view()),
注意:URL结尾最好加上斜杠
/,Django默认开启APPEND_SLASH配置,不加的话可能会触发301重定向,也可能导致匹配失败。
如果你的需求是通过查询参数传递用户ID(比如/count/?id=1),那路由不需要带参数,直接写:
path('count/', CountlListView.as_view()),
2. 按用户ID过滤数据的错误点
你的模型里userId是外键关联User,直接用queryset.filter(userId=userId)会尝试用字符串/数字去匹配User对象,肯定匹配不到。正确的过滤方式是针对外键的ID字段:
- 用
userId_id=user_id(Django自动给外键生成的后缀_id字段,对应数据库里的存储列) - 或者用
userId__pk=user_id(ORM的双下划线关联查询)
修正视图逻辑
情况一:用路径参数传递用户ID
class CountlListView(ListAPIView): serializer_class = CountSerializers def get_queryset(self, *args, **kwargs): queryset = Count.objects.all() # 从路径参数中获取用户ID user_id = self.kwargs.get('pk') if user_id: # 过滤外键对应的ID queryset = queryset.filter(userId_id=user_id) return queryset
情况二:用查询参数传递用户ID
class CountlListView(ListAPIView): serializer_class = CountSerializers def get_queryset(self, *args, **kwargs): queryset = Count.objects.all() # 从GET查询参数中获取id user_id = self.request.query_params.get('id') print(user_id) if user_id: # 注意这里用userId_id匹配外键ID queryset = queryset.filter(userId_id=user_id) return queryset
额外建议
按照Python的PEP8规范,模型字段名建议用小写+下划线,比如把userId改成user,channelId改成channel,这样代码更易读,后续维护也更方便,比如过滤的时候直接写user_id=user_id,语义更清晰。
内容的提问来源于stack exchange,提问作者imsaiful
相关产品推荐
相关产品推荐

