Django报错TypeError: Field.__init__()收到意外关键字参数'id'原因排查
Django报错:TypeError: Field.init() got an unexpected keyword argument 'id' 原因解析
错误根源总结:
你的代码存在三处核心问题,共同触发了该报错:
1. User模型的__init__方法多余且错误
Django的Model类已实现完善的实例化逻辑,完全不需要手动重写__init__。你自定义的方法里:
def __init__(self, name, password, *args, **kwargs): super().__init__(*args, **kwargs) self.id = id # 此处id是未定义变量,会先引发NameError self.name = name self.password = password
- 手动赋值
self.id = id中的id未定义,本身就存在语法错误; - 强制重写初始化逻辑会破坏Django模型字段的初始化流程,导致字段处理时传入非法参数。
解决:直接删除这个自定义的__init__方法
2. UserSerializer的__init__方法错误且多余
ModelSerializer不需要手动重写__init__,你写的方法里同样存在self.id = id的未定义变量问题,且当你用关键字参数传值实例化Serializer时,这些参数会被当成字段初始化参数传递给Field类,而Field的__init__方法不接受id这个参数——这就是报错的直接触发点。
解决:删除Serializer里自定义的__init__方法
3. Views中Serializer实例化方式错误
在find_user视图里,你错误地用关键字参数传递字段值:
user_serializer = UserSerializer(id=user.id, name=user.name, password=user.password)
ModelSerializer的正确实例化方式是传入instance参数(对应数据库实例),或data参数(对应待序列化字典)。正确写法:
user_serializer = UserSerializer(instance=user) # 或简写为 user_serializer = UserSerializer(user)
额外补充:GET请求的request.body通常为空,用json.loads(request.body)会报错,应该用request.GET.get('id')获取URL参数。
内容的提问来源于stack exchange,提问作者HyeonJi Kim
相关产品推荐
相关产品推荐

