Функция SerializerMethodField get_fieldname не вызывается

У меня есть этот Serializer

    class RemovePermissionsSerializer(serializers.ModelSerializer):
        user_permissions = serializers.SerializerMethodField()

        def get_user_permissions(self, instance):
            print(1)
            **logic**
            return data

        class Meta:
            model = User
            fields = [
                "user_permissions"
            ]

и общий набор представлений с этим действием

@action(
        methods=["patch", "put"],
        detail=True,
        url_name="add-permissions",
        url_path="add-permissions"
    )
    def add_permissions_request(self, request, pk):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = self.get_object()
        user_permissions = serializer.validated_data.get("user_permissions")
        response = User.add_permissions(user, user_permissions)
        return Response(response, status=status.HTTP_200_OK)

функция get_user_permissions не вызывается, что бы я в нее не вставил, даже print() ничего не показывает, помогите пожалуйста?

Здесь вы используете сериализатор по-другому. Сериализатор SerializerMethodField - это только для чтения: поскольку функция всегда является вводом для вывода. Здесь вы пытаетесь работать с ним в направлении записи.

Это одна из многих причин, почему использование SerializerMethodField часто не является хорошей идеей.

Usually it makes more sense to work with a sub-serializer, a PrimaryKeyRelatedField [drf-doc], or a SlugRelatedField [drf-doc].

Вы можете, например, использовать:

from django.contrib.auth.models import Permission


class PermissionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Permission
        fields = ['__all__']


class RemovePermissionsSerializer(serializers.ModelSerializer):
    user_permissions = PermissionSerializer(source='permission', many=True)

    class Meta:
        model = User
        fields = ['user_permissions']

тогда вы указываете все детали разрешения, или вы можете работать с PrimaryKeyRelatedField или SlugRelatedField, чтобы позволить пользователю указать первичный ключ разрешения, или какое-то другое поле ("slug"):

from django.contrib.auth.models import Permission


class RemovePermissionsSerializer(serializers.ModelSerializer):
    user_permissions = serializers.PrimaryKeyRelatedField(
        source='permission', many=True, queryset=Permission.objects.all()
    )

    class Meta:
        model = User
        fields = ['user_permissions']
Вернуться на верх