Как исключить указанные c свойства в Django Rest Framework Serializer на основе зарегистрированного пользователя? - PullRequest
1 голос
/ 14 января 2020

У меня есть Django Rest Framework API, в котором я разрешаю только зарегистрированным пользователям новые элементы POST. ViewSet выглядит следующим образом:

class APIAuthGroup(InAuthGroup):
    """
    A permission to only allow WRITE/POST access if and only if a user is logged in,
    and is a member of the SA role inside keycloak.
    """
    allowed_group_names = [settings.KEYCLOAK_SA_WRITE_PERMISSION]

    def has_permission(self, request, view):
        return request.method in SAFE_METHODS \
               or super(APIAuthGroup, self).has_permission(request, view)


class DevicesViewSet(DatapuntViewSetWritable):
    """
    A view that will return the devices and makes it possible to post new ones
    if the user is logged in
    """

    queryset = Device.objects.all().order_by('id')

    serializer_class = DeviceSerializer
    serializer_detail_class = DeviceSerializer

    http_method_names = ['post', 'list', 'get']

    permission_classes = [APIAuthGroup]

И мой сериализатор:

class PersonSerializer(HALSerializer):
    name = serializers.CharField(required=True, allow_blank=False, max_length=255)
    email = serializers.EmailField()
    organisation = serializers.CharField(required=False, allow_blank=True, max_length=250)

    class Meta:
        model = Person
        fields = ('name', 'email', 'organisation')


class DeviceSerializer(HALSerializer):
    long = serializers.SerializerMethodField()
    lat = serializers.SerializerMethodField()
    organisation = serializers.SerializerMethodField()
    owner = PersonSerializer()
    contact = PersonSerializer(required=False)

    class Meta:
        model = Device
        fields = (
            '_links',
            'id',
            'frequency',
            'longitude',
            'latitude',
            'organisation',
            'owner',
            'contact'
        )

    def get_organisation(self, obj):
        if obj.owner:
            return obj.owner.organisation
        return 'Onbekend'

Теперь я хочу, чтобы только owner и contact возвращались, если пользователь вошел в систему. и если вошедший в систему адрес электронной почты пользователя равен owner.email.

, я не уверен, как и где я мог бы сделать это, хотя. Должен ли я сделать это в сериализаторе или в наборе? И как?

Все советы приветствуются!

1 Ответ

1 голос
/ 14 января 2020

Вы можете переопределить метод to_representation сериализатора:

class DeviceSerializer(HALSerializer):
    long = serializers.SerializerMethodField()
    lat = serializers.SerializerMethodField()
    organisation = serializers.SerializerMethodField()
    owner = PersonSerializer()
    contact = PersonSerializer(required=False)

    class Meta:
        model = Device
        fields = (
            '_links',
            'id',
            'frequency',
            'longitude',
            'latitude',
            'organisation',
            'owner',
            'contact'
        )

    def get_organisation(self, obj):
        if obj.owner:
            return obj.owner.organisation
        return 'Onbekend'

    def to_representation(self, instance):
        data = super().to_representation(instance)
        if obj.owner != self.context["request"].user:
            data.pop("owner")  # remove from response
            data.pop("contact")  # remove from response
        return data 

Примечание self.context атрибут, который содержит объект запроса. Вы можете найти более подробную информацию об этом здесь .

...