2025-04-27 17:00:35 by wst
django有这样一个需求:创建任务的时候需要保存创建者,但是创建者是从request的session中获取的。
解决方法:把request想办法传递到serializer中即可。
代码如下:
视图:
class CombatTaskViewSet(GenericViewSet):
queryset = CombatTask.objects.filter(is_delete=False)
serializer_class = CombatTaskSerializer
filter_class = CombatTaskFilter
filter_backends = [DjangoFilterBackend]
@list_route(methods=['POST'])
def add_task(self, request):
"""
添加作战任务
"""
try:
LOGGER.info("添加作战任务参数:{}".format(request.data))
request.data["create_name"] = request.session.get("username")
serializer = self.get_serializer(data=request.data, context={"request": request})
serializer.is_valid(raise_exception=True)
_ = serializer.save()
return response.SuccessResponse({"data": "ok", "user": request.session.get("username")})
except Exception as e:
LOGGER.error("添加作战任务失败, error:{}".format(e))
error_message = str(e).encode('utf-8').decode('unicode_escape')
return response.ErrorResponse(msg="添加作战任务失败:{}".format(error_message))
序列化器:
class CombatTaskSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
task_id = serializers.CharField(read_only=True)
name = serializers.CharField(max_length=64)
picture_url = serializers.CharField(max_length=1024)
status = serializers.CharField(read_only=True)
create_time = serializers.DateTimeField(read_only=True)
create_name = serializers.CharField(required=False, read_only=True)
class Meta:
model = CombatTask
def validate_name(self, value):
"""
校验 name 字段是否重复
"""
# 如果是更新操作,跳过重复检查
if self.instance:
return value
# 如果是创建操作,检查数据库中是否已存在相同的 name
if CombatTask.objects.filter(name=value).exists():
raise serializers.ValidationError(u"任务名称已存在")
return value
@atomic
def create(self, validated_data):
try:
task_id = uuid.uuid4()
validated_data["status"] = "created"
validated_data["task_id"] = task_id
create_name = self.context["request"].session.get("username")
validated_data["create_name"] = create_name
instance = CombatTask.objects.create(**validated_data)
return instance
except Exception as e:
return None
注意试图中的:serializer = self.get_serializer(data=request.data, context={"request": request})
以及序列化器中的:create_name = self.context["request"].session.get("username")
看完这两行大概就能明白是怎么回事了。
祝你好运,一个热爱编程热爱分享的小鲤鱼。