Django创建含子任务与用户的任务时解决空字段错误
问题修复:Django DRF创建带子任务和关联用户的任务时的校验错误
问题分析
当前创建任务时触发两个校验错误:
- 子任务的
task_id字段提示「不能为null」 - 关联用户时要求提供
email、password、name等必填字段
本质是序列化器配置未适配「关联已有对象」的场景,默认按「创建新对象」的逻辑做校验。
解决方案
1. 修复用户关联的序列化器配置
TaskSerializer中使用UserSerializer会触发完整的用户字段校验,但我们仅需关联已存在的用户,改用PrimaryKeyRelatedField即可:
修改serializers.py中的TaskSerializer:
class TaskSerializer(serializers.ModelSerializer): """Serializes a task object""" subtasks = SubtaskSerializer(many=True, required=False) # 替换UserSerializer为PrimaryKeyRelatedField,自动校验用户存在性 users = serializers.PrimaryKeyRelatedField( many=True, required=False, queryset=get_user_model().objects.all() ) class Meta: model = Task fields = ['id', 'title', 'description', 'due_to', 'created', 'updated', 'priority', 'category', 'status', 'subtasks', 'users'] read_only_fields = ['created', 'updated'] def create(self, validated_data): users = validated_data.pop('users', None) subtasks_data = validated_data.pop('subtasks', None) task = Task.objects.create(**validated_data) if users: task.users.add(*users) # 直接批量关联用户,无需循环查询 if subtasks_data: for subtask_data in subtasks_data: # 直接关联已创建的task对象,无需处理task_id Subtask.objects.create(task=task, **subtask_data) return task
2. 修复子任务的task_id校验问题
请求中不需要传task_id(任务未创建时id不存在),修改SubtaskSerializer,移除手动定义的task_id字段,由模型外键自动处理:
修改serializers.py中的SubtaskSerializer:
class SubtaskSerializer(serializers.ModelSerializer): class Meta: model = Subtask fields = ['id', 'description', 'is_done'] read_only_fields = ['id'] # 移除自定义create方法,DRF会通过传入的task对象自动关联外键
同时调整请求载荷,移除子任务中的task_id字段,用户字段直接传ID列表:
{ "id": null, "title": "aa", "description": "aaaa", "due_to": "2024-06-27T22:00:00.000Z", "created": null, "updated": null, "priority": "LOW", "category": "TECHNICAL_TASK", "status": "TO_DO", "subtasks": [ {"description": "s1", "is_done": false}, {"description": "s2", "is_done": false} ], "users": [6,7] }
关键说明
PrimaryKeyRelatedField会自动校验传入的用户ID是否存在,无需手动查询,请求只需传ID列表。- 子任务的外键关联由
TaskSerializer的create方法统一处理,创建任务后直接关联子任务,避免了未创建任务时task_id为空的校验错误。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

