如何通过SlugRelatedField限制序列化器,仅食物关联用户可上传图片?
你当前的写法会报错,因为在定义SlugRelatedField的类阶段,current_user只是序列化器的字段定义,并非实际的用户实例,没法直接用于过滤queryset。以下是两种可行的实现方式:
方法一:重写get_fields动态设置权限范围内的QuerySet
from rest_framework import serializers from .models import FoodImages, Food class FoodImagesSerializerGet(serializers.ModelSerializer): current_user = serializers.HiddenField(default=serializers.CurrentUserDefault()) class Meta: model = FoodImages fields = ['id', 'food', 'current_user'] # 按需调整返回字段 def get_fields(self): fields = super().get_fields() # 从请求上下文获取当前用户 user = self.context['request'].user # 过滤出仅当前用户关联的Food对象 fields['food'].queryset = Food.objects.filter(users=user.profile) return fields
注:如果你的User模型直接与Food的
users字段关联(而非通过Profile中间模型),将user.profile替换为user即可。
方法二:在__init__方法中动态更新QuerySet
from rest_framework import serializers from .models import FoodImages, Food class FoodImagesSerializerGet(serializers.ModelSerializer): current_user = serializers.HiddenField(default=serializers.CurrentUserDefault()) food = serializers.SlugRelatedField( many=False, read_only=False, slug_field='id', queryset=Food.objects.none() ) class Meta: model = FoodImages fields = ['id', 'food', 'current_user'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 仅当存在请求上下文时更新QuerySet if 'request' in self.context: user = self.context['request'].user self.fields['food'].queryset = Food.objects.filter(users=user.profile)
两种方式都会让DRF自动验证用户提交的food是否属于其关联的对象,不符合权限的请求会返回验证错误,从而实现仅允许与食物关联的用户上传图片的需求。
内容的提问来源于stack exchange,提问作者Leviathan
相关产品推荐
相关产品推荐

