You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SlugRelatedField限制序列化器,仅食物关联用户可上传图片?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:05:18