Django Serializer的validate方法多条件校验触发ValidationError问题
问题排查结果
你的代码存在两处明确错误:
- 类型匹配错误:
attrs['author'].id是UUID类型的主键值,self.context['request'].user是User模型实例,二者类型完全不同,对比结果永远为False。and连接的两个条件只要有一个为False,整个判断就不成立,自然会直接抛出异常。
你需要将对比逻辑修改为同类型对比,两种修改方案二选一即可:
# 方案1:对比主键值 attrs['author'].id == self.context['request'].user.id # 方案2:直接对比模型实例 attrs['author'] == self.context['request'].user
- 校验逻辑写反:你当前的判断逻辑是「只有发起关注的是当前用户 且 被关注用户的主页是私密状态」才允许通过校验,其他所有场景(包括被关注用户是公开主页的正常场景)都会直接抛出异常,完全不符合常规业务逻辑。
常规的关注操作校验逻辑应该是:先校验操作人确实是当前登录用户(防止越权替他人发起关注),之后根据业务规则判断是否允许关注,修正后的参考代码如下:
def validate(self, attrs): attrs = super().validate(attrs) # 先校验操作人必须是当前登录用户 if attrs['author'] != self.context['request'].user: raise ValidationError('Unauthorized Request') # 可根据业务调整权限规则,示例为仅允许关注公开主页的用户 if not attrs['profile'].public_profile: raise ValidationError('Cannot follow private profile') return attrs
内容的提问来源于stack exchange,提问作者user14491987
相关产品推荐
相关产品推荐

