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

DRF框架下axios POST请求传递<int:id>路径参数触发ValueError报错

问题根因

这个报错和axios传递的路径参数id=1、路由配置、数据库迁移都没有关系,你之前的排查方向完全偏了。
从错误回溯栈可以直接定位到触发报错的是你视图函数第38行的thread.liked.add(request.user.username)代码,不是查询Thread的那行——说明路径里的id=1已经被Django正确解析,目标Thread对象也成功查到了。
报错的直接原因有两个:

  • liked是绑定到Account模型的多对多关联字段,调用add()/remove()方法时,必须传入Account模型实例,不能直接传username这类字段值。你传入字符串类型的request.user.username后,Django会默认把这个值当做关联模型的主键id去做整数转换,自然会触发类型错误。
  • 你当前的请求没有携带有效登录态,request.user是Django默认的匿名用户对象,request.user.username的取值是空字符串'',所以最终抛出Field 'id' expected a number but got ''的错误。

另外你的axios写法也有问题:post方法的第二个参数是请求体,你把headers配置错放到了请求体的位置,实际请求根本没带上你写的headers配置,也没配置跨域携带凭证,后端拿不到登录信息也和这个写法有关。

修复方案
  1. 修正视图函数的收藏逻辑,增加登录校验,多对多操作直接传用户实例:
@csrf_exempt
def add_favourites(request, id):
    thread = get_object_or_404(Thread, id=id)
    
    if request.method == 'POST':
        # 拦截未登录用户
        if not request.user.is_authenticated:
            return Response({"detail": "请登录后操作"}, status=status.HTTP_401_UNAUTHORIZED)
        
        # 直接传用户实例做关联操作,不要传username字符串
        if thread.liked.filter(id=request.user.id).exists():
            thread.liked.remove(request.user)
        else:
            thread.liked.add(request.user)
        
        # 用序列化器处理返回数据,避免模型对象无法直接序列化的问题
        serializer = ThreadSerializer(thread)
        return Response(serializer.data, status=status.HTTP_200_OK)
  1. 修正axios请求的参数顺序,补全跨域携带凭证的配置:
    axios的post方法签名是post(url, 请求体数据, 配置项),没有请求体就传空对象,headers、withCredentials这类配置要放在第三个参数里:
const baseURL = 'http://localhost:8000/';

const axiosInstance = axios.create({
  baseURL: baseURL,
  timeout: 5000,
  // 全局配置跨域携带cookie,省得每个请求单独写
  withCredentials: true
});

await axiosInstance.post(`api/public/favourites/1/`, {}, {
  headers: {
    'content-type': 'application/json',
  }
});
  1. 确认后端的跨域配置已经允许携带凭证,如果你用token认证,要把token按后端的认证规则放到请求头里,保证后端能正确识别到登录用户。
排查提示

后续遇到这类报错先看错误栈里指向你自己写的业务代码的行号,不要一上来就怀疑路由、数据库这类已经走到业务逻辑之前的环节——如果真的是路径参数id解析错,报错会触发在get_object_or_404那行,根本走不到后面add收藏的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:48:33