Как получить доступ к контексту в сериализаторе 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
Я думаю, что это намного чище, чем общепринятый ответ, но это может быть анти-паттерном