Как принудительно задать значение при создании с помощью django-rest-framework ModelViewSet?

У меня есть api, где пользователи могут создавать различные объекты. Если пользователь является частью персонала, он может создать объект со всеми значениями, которые он хочет. Однако, если пользователь не является частью персонала, я хочу принудительно установить значение определенного поля.

Я добавил следующий код в набор представлений, который работает хорошо:

    @swagger_auto_schema(responses={201: CategoryProductSerializer})
    def create(self, request, *args, **kwargs):
        if not self.request.user.is_staff:
            request.data['client']=request.user.profil.client.pk
        print(request.data)
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save() 

Как я могу "обобщить" это на все мои наборы представлений модели? Важной частью этого создания, которая должна быть общей для всех моих наборов представлений, является :

if not self.request.user.is_staff:
   request.data['client']=request.user.profil.client.pk

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

serializer = self.get_serializer(data=request.data, context={"user": request.user})

затем используйте метод сериализаторов validate или validate_client для выполнения вашей проверки

if not self.context['user'].is_staff:
    pass

Поскольку вопрос в основном "Как обобщить". Я думаю, вам следует создать свое собственное промежуточное программное обеспечение.

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        # Code to be executed for each request/response after
        # the view is called.
        return response

    def process_view(self,request,view_func,*view_args,**view_kwargs):
           if not request.user.is_staff:
               request.client=request.user.profil.client.pk

Убедитесь, что вы включили промежуточное ПО в ваш MIDDLEWARE блок settings.py. Также убедитесь, что вы добавили его ПО ПО ПОСЛЕ AuthenticationMiddleware.

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