Как получить доступ к контексту в сериализаторе queryset

Я ищу способ доступа к контексту для фильтрации по текущему пользователю

 class RemovePermissionsSerializer(serializers.Serializer):
        user_permissions = serializers.PrimaryKeyRelatedField(
            many=True, queryset=Permission.objects.filter(user = context.get('request').user)
        )

Я не могу получить доступ к контексту, потому что он не определен, ни self.context

Предоставили ли вы контекст при инициализации сериализатора? Если вы хотите, чтобы контекст был доступен внутри сериализатора, вам придется предоставить его самостоятельно, например:

serializer = RemovePermissionsSerializer(instance, context={"request": request})

или

serializer = RemovePermissionsSerializer(instance, context={"user": request.user})

То есть контекст запроса не доступен автоматически в сериализаторе

Для достижения этой цели переопределите метод get_fields в RemovePermissionsSerializer, как показано ниже:

class RemovePermissionsSerializer(serializers.Serializer):

def get_fields(self):
    fields = super().get_fields()
    # If you want your logic according to request method
    request = self.context.get('request')
    if request and request.method.lower() == "<your method here>":
        fields['user_permissions'] = serializers.PrimaryKeyRelatedField(
            many=True, queryset=Permission.objects.filter(user=request.user)
        )
    
    return fields

Если вы хотите изменить представление в зависимости от действия, вы можете сделать примерно следующее:

class RemovePermissionsSerializer(serializers.Serializer):

def get_fields(self):
    fields = super().get_fields()
    # IF you want your logic according to action
    view = self.context.get('view')
    if view and view.action == "<action name>":
        fields['user_permissions'] = serializers.PrimaryKeyRelatedField(
            many=True, queryset=Permission.objects.filter(user=request.user)
        )
    return fields

Другой вариант - создать сериализатор с помощью метода, что-то вроде:

def get_remove_permission_serializer(user):      
    class RemovePermissionsSerializer(serializers.Serializer):
                user_permissions = serializers.PrimaryKeyRelatedField(
                    many=True, queryset=Permission.objects.filter(user = user)
                )
    return RemovePermissionsSerializer

Я думаю, что это намного чище, чем общепринятый ответ, но это может быть анти-паттерном

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