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'"的错误。
解决步骤
调整路由顺序
在你的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), ]添加参数类型约束
给动态id路由添加<int:id>类型限制,这样只有数字会被匹配到该路由,即使路由顺序临时出错,非数字的add也不会被错误解析为id参数。确认请求方法匹配
你的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
相关产品推荐
相关产品推荐

