2016-03-08 6 views
3

я определила следующие моделиПроверьте разрешения на родственный объект в Django REST Framework

class Flight(models.Model): 
    ... 

class FlightUpdate(models.Model): 
    flight = models.ForeignKey('Flight', related_name='updates') 
    ... 

и следующий Viewset с помощью NestedViewsetMixin в REST Framework Extensions

class FlightUpdateViewSet(mixins.ListModelMixin, 
         mixins.CreateModelMixin, 
         NestedViewSetMixin, 
         viewsets.GenericViewSet): 
    """ 
    API Endpoint for Flight Updates 
    """ 
    queryset = FlightUpdate.objects.all() 
    serializer_class = FlightUpdateSerializer 

    def create(self, request, *args, **kwargs): 
     flight = Flight.objects.get(pk=self.get_parents_query_dict()['flight']) 
     ... 

Так, чтобы получить доступ к FlightUpdates, связанный с Flight, URL-адресом является /flights/1/updates/.

Я хочу, чтобы гарантировать, что люди могут только создатьFlightUpdates, если у них есть права доступа к изменениямFlight объекта, с которым FlightUpdate связан.

Как я могу выполнить дополнительную проверку при добавлении FlightUpdate? Я попытался добавить что-то вроде этого в viewet, но я не уверен, что это лучший способ.

if not request.user.has_perm('flights.change_flight', flight): 
    raise PermissionError() 

Примечание: Я использую django-rules для реализации прав доступа на уровне объектов.

ответ

0

Я решил эту проблему, выполнив собственный класс разрешений.

from django.core.exceptions import ObjectDoesNotExist 

from rest_framework.permissions import BasePermission, SAFE_METHODS 

from .models import Flight 


class FlightPermission(BasePermission): 

    def has_permission(self, request, view): 
     if request.method in SAFE_METHODS: 
      return True 

     try: 
      flight = Flight.objects.get(pk=view.kwargs['parent_lookup_flight']) 
     except ObjectDoesNotExist: 
      return False 

     return request.user.has_perm('flights.change_flight', flight) 
Смежные вопросы