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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:05:14