Django Rest Framework получает параметры внутри has_permission - PullRequest
0 голосов
/ 24 апреля 2020

Я фильтрую набор запросов недвижимости в зависимости от статуса пользователя и района (последний с параметром GET).

В views.py у меня есть это:

class RealEstateView(APIView):
    serializer_class = RealEstateSerializer
    permission_classes = [RealEstatePermission]

    def get(self, request):
        district = self.request.query_params.get('pk')
        if district:
            serializer = RealEstateSerializer(RealEstate.objects.filter(owner_id=district), many=True)
        else:
            serializer = RealEstateSerializer(RealEstate.objects.all(), many=True)
        return Response(serializer.data)

Если пользователь суперпользователь, он имеет доступ ко всей информации. Если пользователь не является суперпользователем, он может получить доступ только к недвижимости из района, за который он отвечает. Если пользователь отвечает за район с id=1, но отправляет параметр get с id=2, мне нужно вызвать исключение. Но проблема в том, что я не знаю, как получить доступ к параметру get в функции has_permission. Делать это изнутри, чтобы получить функцию get, не очень хорошая идея.

Я уже пробовал request.resolver_match.kwargs.get('id') и view.kwargs.get('id'), оба они пусты.

в permissions.py:

class RealEstatePermission(permissions.BasePermission):

    def has_permission(self, request, view):
        if request.user.is_authenticated:
            if request.user.is_staff:
                return True

            ## HERE I need something like request.user.district.id == kwargs('id')
            if request.user.role == 'district_municipality':
                return True

Использование Django 3.0.5 и DRF 3.11.0.

Спасибо за помощь.

1 Ответ

1 голос
/ 24 апреля 2020

Чтобы получить доступ к параметрам из URL-запроса, вы можете использовать GET dict.

Пример

url:

/district?id=2

доступ:

district_id = request.GET['id']
...