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

Django触发ValueError: Field 'id' expected a number but got ''

问题说明

运行Django购物车添加功能时抛出如下错误:

ValueError: Field 'id' expected a number but got ''
错误含义为模型id字段预期接收数字类型值,实际传入了空字符串。

触发原因

错误出在商品查询代码行:producto = Producto.objects.get(pk=request.POST.get('product_id'))

  • 发起添加购物车请求时,POST参数中未携带product_id,或product_id对应值为空字符串,此时request.POST.get('product_id')返回值为''
  • Django ORM查询主键(即id字段)时要求传入数字类型参数,接收到空字符串后直接抛出值错误
  • 现有代码缺少必要的参数校验逻辑,还存在两个潜在报错点:传入的product_id不是合法数字、传入id对应的商品不存在,这两类场景同样会触发服务端500错误。
解决方案

后端视图层修复

给接口增加请求方式校验、参数非空校验、格式校验、数据存在性校验,修改后的完整视图代码:

from django.http import HttpResponseBadRequest
from .models import Producto
# 按项目实际路径导入get_or_create_cart方法

def add(request):
    # 仅允许POST方式访问接口
    if request.method != "POST":
        return HttpResponseBadRequest("非法请求方式")
    
    # 校验必填参数product_id是否存在
    product_id = request.POST.get('product_id')
    if not product_id:
        return HttpResponseBadRequest("缺少必填商品ID参数")
    
    # 校验商品ID格式是否为合法数字
    try:
        product_id = int(product_id)
    except (TypeError, ValueError):
        return HttpResponseBadRequest("商品ID格式非法")
    
    # 校验对应商品是否存在
    try:
        producto = Producto.objects.get(pk=product_id)
    except Producto.DoesNotExist:
        return HttpResponseBadRequest("指定商品不存在")
    
    # 执行购物车添加逻辑
    cart = get_or_create_cart(request)
    cart.productos.add(producto)

    return render(request, 'carts/add.html', {
        'producto': producto
    })

前端传参排查

  • 若通过表单提交请求,检查商品ID对应的表单项name属性是否为product_id,项的value值是否正确绑定商品数字ID,不存在空值情况
  • 若通过AJAX异步提交,检查请求体参数名拼写是否正确,是否漏传product_id字段,字段值是否为非空数字类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:15:56