简体   繁体   English

如何根据发出请求的用户动态过滤 django rest api get request 中返回的字段?

[英]How do I dynamically filter fields returned in django rest api get request based on the user making the request?

I have a photoshoot api that allows photographers to post shoot photos from which preview and watermarded versions are derived.我有一张照片 api,允许摄影师发布从中派生previewwatermarded版本的照片。 Editors and clients can both select which photos will be edited, but the editor should only see the preview without watermark and the clients should only see the watermarked versions.编辑和客户都可以 select 哪些照片将被编辑,但编辑只能看到没有水印的preview ,客户只能看到带watermarked的版本。
I was wondering how these different distincitons can be made in the DRF queryset.我想知道如何在 DRF 查询集中做出这些不同的区别。
My model:我的 model:


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)

My Serializer:我的序列化器:


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

My view:我的观点:


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)

I was able to solve this issue by creating separate serializers with different fields for the different cases.我能够通过为不同的情况创建具有不同fields的单独序列化程序来解决这个问题。 UneditedSerializer remained as is but I created other serializers: 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")

I then modified the viewset to check against the user making the request to determine which serializer to use.然后,我修改了视图集以检查发出请求以确定要使用哪个序列化程序的用户。 Like so:像这样:


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)

And now it works as intended.现在它按预期工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Django管理员:如何根据对象(而非request.user)的数据过滤ForeignKeyField小部件? - Django admin: how do I filter a ForeignKeyField widget based on the object's (not request.user's) data? Django Rest Api过滤器字段基于request.user的选择选项 - Django Rest Api filter field's select options based on request.user 如何在 Django API GET 请求中与 websocket 通信? - How do I communicate with a websocket within a Django API GET request? 如何使用Django REST API验证android用户POST请求? - How to authenticate android user POST request with Django REST API? 如何根据API参数将Django查询集派生到REST请求? - How can I derive a Django queryset to a REST request based on API parameter? 如何将当前登录的用户传递给filter.py,即在Django中基于请求的过滤 - How to pass currently logged in user to filter.py i.e request based Filtering in django 如何从django rest框架Request获取django HttpRequest? - How do I get the django HttpRequest from a django rest framework Request? 如何从 django rest 框架中的请求中获取用户对象? - How to get user object from request in django rest framework? 如何从Django rest API中的ModelViewSet类获取请求的用户名? - How to get username of request from ModelViewSet class in Django rest API? 如何在 django rest api 测试中的 GET 请求中发送数据 - How to send data in GET request in django rest api test
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM