Django REST报错:'Request'对象无'task'属性,POST添加求职申请失败
解决
'Request' object has no attribute 'task'错误 这个错误的根源非常明确:你在TaskWorkerSerializer的自定义create方法里,试图访问self.context['request'].task,但DRF的Request对象(包括底层的WSGIRequest)根本没有task这个属性,这才抛出了AttributeError。
为什么会出现这个问题?
你可能误以为request对象会自动绑定当前的task实例,但实际上,task_id是存储在URL的路径参数(kwargs)里的,而不是直接挂在request对象上。更关键的是:你的perform_create方法已经帮你处理好了task和worker的赋值,完全不需要在Serializer里重复操作。
最简单的解决方案:删除Serializer中的自定义create方法
看你的views.py代码,perform_create已经明确通过serializer.save(task=task, worker=worker)把task和worker实例传递给了Serializer的save方法,这时候Serializer的默认create方法会直接使用这些传入的参数,不需要你手动修改validated_data。
修改后的serializers.py:
class TaskWorkerSerializer(serializers.ModelSerializer): task = serializers.ReadOnlyField(source='task.id') worker = serializers.ReadOnlyField(source='worker.id') class Meta: model = Task_worker fields = ('id', 'task', 'worker', 'created', ) # 完全删除下面的自定义create方法 # def create(self, validated_data): # validated_data['task_id'] = self.context['request'].task # return super(TaskWorkerSerializer, self).create(validated_data)
如果你确实需要在Serializer中获取task_id(可选)
如果因为某些需求,你必须在Serializer的create方法里获取task_id,正确的方式是从request的路径参数中提取,而不是访问不存在的request.task:
def create(self, validated_data): # 从URL kwargs中获取task_id task_id = self.context['request'].parser_context['kwargs']['task_id'] validated_data['task_id'] = task_id # 注意:如果你的perform_create已经传入了worker,这里不需要再处理worker字段 return super().create(validated_data)
额外验证
你的代码逻辑是合理的:
task和worker字段设置为ReadOnlyField,确保前端无法修改这两个字段,只能由后端赋值perform_create中通过当前登录用户获取worker实例,通过URL参数获取task实例,保证了数据的安全性
删掉多余的自定义create方法后,你的POST请求就能正常将求职申请添加到申请者列表中了。
内容的提问来源于stack exchange,提问作者Roma
相关产品推荐
相关产品推荐

