Django中如何验证模型列表是否存在于QuerySet中?
验证序列化器中用户列表是否全部属于当前用户的组织
以下是实现验证逻辑的完整序列化器代码:
class MySerializer(serializers.ModelSerializer): class Meta: model = models.MyClass fields = "__all__" def validate(self, data): user = self.context.get("request").user users = data.get("users") # 获取当前用户组织下的所有用户QuerySet org_users = User.objects.filter(organization=user.organization) # 提取传入用户的ID集合 submitted_user_ids = {user.id for user in users} # 提取组织内用户的ID集合(仅查询一次数据库) org_user_ids = set(org_users.values_list("id", flat=True)) # 检查是否有传入用户不在组织范围内 invalid_ids = submitted_user_ids - org_user_ids if invalid_ids: raise serializers.ValidationError(f"用户ID {invalid_ids} 不属于当前组织,无法添加") return data
核心逻辑说明:
- 获取组织用户集合:通过一次数据库查询拿到当前用户所在组织的所有用户ID集合,避免多次查询损耗性能。
- 对比用户ID:利用集合的差集操作,快速找出传入用户中不在组织范围内的ID。
- 抛出明确错误:如果存在无效用户,直接返回包含具体ID的验证错误,方便定位问题。
不推荐的低效写法(避坑):
不要直接遍历传入用户并逐个检查是否在QuerySet中,这种方式会为每个用户发起一次数据库查询,当用户数量较多时性能极差:
# 低效写法,请勿使用 for user in users: if user not in org_users: raise serializers.ValidationError(f"用户 {user} 不属于当前组织")
内容的提问来源于stack exchange,提问作者Waleed Farrukh
相关产品推荐
相关产品推荐

