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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:41:06