Django id期望数字报错、blog_id获取失败问题解决方案
问题原因
两个报错同源,都是参数处理不当导致的:
- 前端发起POST请求到点赞接口时,要么没传
blog_id参数,要么传的是空字符串 - 直接把取到的空字符串作为id条件查询Blog模型,而id是数字类型字段,接收到空字符串就会抛出
Field 'id' expected a number but got ''异常,本质就是拿不到合法的blog_id参数。
修复步骤
第一步:排查前端传参
不管是用原生表单提交还是ajax/fetch发异步请求,必须保证请求里携带值为当前博客数字ID的blog_id字段。原生表单提交需要加隐藏域存储博客id,参考写法:<form method="POST" action="/你配置的点赞路由地址/"> {% csrf_token %} <input type="hidden" name="blog_id" value="{{ 模板中当前博客对象.id }}"> <button type="submit">点赞</button> </form>如果是异步请求,检查请求体里有没有正确写入blog_id字段,不要传null或者空字符串。
第二步:后端加参数校验兜底
不要直接把request.POST取到的参数直接丢给ORM查询,先做合法性校验,避免非法值直接触发报错,修改后的视图代码参考:from django.http import HttpResponseBadRequest def like_post(request): blog_id = request.POST.get('blog_id') # 空值直接返回400错误 if not blog_id: return HttpResponseBadRequest("缺少必填参数blog_id") # 非数字格式直接拦截 if not blog_id.isdigit(): return HttpResponseBadRequest("blog_id必须为数字") # 参数合法再执行查库操作 post = get_object_or_404(Blog, id=int(blog_id)) # 后续编写点赞计数、返回响应的业务逻辑即可额外优化点
模型里的like_count字段默认值写的是字符串'0',虽然Django能做隐式转换,但建议直接写成数字0,避免潜在的类型问题:like_count = models.BigIntegerField(default=0)
内容的提问来源于stack exchange,提问作者Sharandeep Singh
相关产品推荐
相关产品推荐

