Я фильтрую набор запросов недвижимости в зависимости от статуса пользователя и района (последний с параметром 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.
Спасибо за помощь.