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

Django API访问/parts/add报错:Field 'id'期望数字却得到'add'

问题原因与解决方案

这个错误的核心原因是URL路由匹配顺序错误:Django在匹配URL时会从上到下遍历路由列表,如果你把带id参数的路由(比如parts/<id>/)放在parts/add/的前面,Django会把add当作id参数的值传递给get_part_details视图,而id字段是AutoField(期望数字类型),自然会抛出"Field 'id' expected a number but got 'add'"的错误。

解决步骤

  1. 调整路由顺序
    在你的urls.py中,将parts/add/的路由放在带id参数的路由之前,确保Django优先匹配固定路径。示例配置如下:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('parts/', views.list_pc_parts),
        # 固定路径放在前面,优先匹配
        path('parts/add/', views.add_pc_part),
        # 用<int:id>限制参数为整数,进一步避免非数字被误匹配
        path('parts/<int:id>/', views.get_part_details),
        path('parts/<int:id>/update/', views.update_pc_part),
    ]
    
  2. 添加参数类型约束
    给动态id路由添加<int:id>类型限制,这样只有数字会被匹配到该路由,即使路由顺序临时出错,非数字的add也不会被错误解析为id参数。

  3. 确认请求方法匹配
    你的add_pc_part视图用了@require_http_methods(["PUT"]),请确保你发送的请求是PUT方法;如果是添加资源更常用的POST方法,需要修改装饰器为@require_http_methods(["POST"]),同时保持路由配置正确。

额外提示

  • Django默认会给模型自动生成AutoField主键id,你在PCparts模型中显式定义id = models.AutoField(primary_key=True)是合法的,但完全可以省略这一行,Django会自动处理主键生成。
  • 检查你的序列化器partSerializer,确保id字段设置为read_only=True(如果用的是ModelSerializer,默认就是只读状态),避免前端传入id字段导致冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:13:28