Как динамически фильтровать поля, возвращаемые в запросе django rest api get на основе пользователя, делающего запрос?

У меня есть api фотосессии, который позволяет фотографам размещать фотографии, из которых получаются версии preview и watermarded. Редакторы и клиенты могут выбирать, какие фотографии будут отредактированы, но редактор должен видеть только preview без водяного знака, а клиенты - только watermarked версии.
Мне интересно, как эти различные различия могут быть сделаны в DRF кверисете.
Моя модель:


class Unedited(models.Model):
    shoot = models.ForeignKey(
        Shoot, on_delete=models.CASCADE, null=True, related_name="shoot_photo"
    )
    original = models.ImageField(null=True, blank=False, upload_to=shoot_upload_to)
    preview = models.ImageField(null=True, blank=True, upload_to=shoot_upload_to)
    watermarked = models.ImageField(null=True, blank=True, upload_to=shoot_upload_to)
    upload_time = models.DateTimeField(auto_now_add=True)

Мой сериализатор:


class UneditedSerializer(serializers.ModelSerializer):
    class Meta:
        model = Unedited
        fields = "__all__"

    def create(self, validated_data):
        validated_data["preview"] = reduce_resolution(validated_data["original"])
        validated_data["watermarked"] = add_watermark(validated_data["preview"])
        img_obj = Unedited.objects.create(**validated_data)
        img_obj.save()
        return img_obj

Мое мнение:


class UneditedViewSet(viewsets.ModelViewSet):
    if not TESTING:
        permission_classes = (PhotosPermission,)
    serializer_class = UneditedSerializer

    def get_queryset(self):
        return Unedited.objects.filter(**self.request.query_params)

Я смог решить эту проблему, создав отдельные сериализаторы с разными fields для разных случаев. UneditedSerializer остался как есть, но я создал другие сериализаторы:


class UneditedMarkedSerializer(serializers.ModelSerializer):
    class Meta:
        model = Unedited
        fields = ("watermarked", "shoot", "upload_time")


class UneditedPreviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Unedited
        fields = ("preview", "shoot", "upload_time")

Затем я модифицировал набор представлений для проверки пользователя, делающего запрос, чтобы определить, какой сериализатор использовать. Например, так:


class UneditedViewSet(viewsets.ModelViewSet):
    if not TESTING:
        permission_classes = (PhotosPermission,)
    serializer_class = UneditedSerializer

    def get_queryset(self):
        return generic_queryset(Unedited, self.request.query_params)

    def list(self, request):
        queryset = self.get_queryset()
        if request.user.is_anonymous or request.user.role == "CLIENT":
            serializer = UneditedMarkedSerializer(queryset, many=True)
        elif request.user.role == "EDITOR":
            print(request.user.role)
            serializer = UneditedPreviewSerializer(queryset, many=True)
        elif request.user.role in ("ADMIN", "STAFF"):
            serializer = UneditedSerializer(queryset, many=True)
        return Response(serializer.data)

И теперь все работает, как задумано.

Вернуться на верх