Django中如何通过外键关联访问其他表字段?
解决序列化器中通过外键验证用户角色的问题
你之前用data['validatorid__userroleid']报错,是因为序列化器的data字典里只有你定义的字段(比如validatorid),ORM的双下划线关联查询语法不能直接用在这里——双下划线是给QuerySet过滤用的,不是用来取序列化器data里的键。
要验证validatorid对应的用户角色,你需要先通过传入的validatorid获取到对应的userTable实例,再逐层访问关联的userroleid和角色ID。
修改后的序列化器validate方法如下:
class ValidatorPartSerializer(serializers.ModelSerializer): class Meta: model = partsTable fields = ['pid', 'partsid', 'validatorid', (...)] read_only_fields = ['pid', 'partsid',(...)] def validate(self, data): validator_user_id = data.get('validatorid') # 先检查是否传入了validatorid if not validator_user_id: raise serializers.ValidationError("请指定验证用户") try: # 根据userid查询对应的用户实例 validator_user = userTable.objects.get(userid=validator_user_id) except userTable.DoesNotExist: raise serializers.ValidationError("指定的验证用户不存在") # 检查用户的角色ID,假设拥有验证权限的角色ID是2 if validator_user.userroleid.roleid != 2: raise serializers.ValidationError("Sorry! You entered a user with no validator permissions.") return data def update(self, instance, validated_data): instance.validatorid = validated_data.get('validatorid', instance.validatorid) instance.partsstatusid = validated_data.get('partsstatusid', instance.partsstatusid) instance.save() return instance
补充说明:
- 因为
userTable的主键是UUID类型,所以传入的validatorid应该是符合格式的UUID字符串,查询时会自动匹配。 - 如果你的验证逻辑是基于角色名称(比如
role字段是"Validator"),也可以改成判断validator_user.userroleid.role == "Validator",更直观。 - 如果担心频繁查询数据库影响性能,可以考虑加缓存,或者在序列化器中提前嵌套用户角色信息,但对于简单验证来说,直接查询足够用。
内容的提问来源于stack exchange,提问作者anastasia
相关产品推荐
相关产品推荐

