5

Django REST çerçevesini nested router extension ile kullanıyorum. Rotalarımdan biri şu şekilde görünüyor: companies/$company/locations/$location, $company ve $location, sümük değişkenleridir.Django REST Yuvalanmış Yollarda İzinler

Kullanıcıların yeni adres eklemek için bu URL'ye POST göndermesine izin vermek istiyorum: companies/$company/locations/. POST yapan kullanıcının, POST yapmakta olduğu şirket için düzeltme izinlerine sahip olduğundan emin olmak istiyorum. Nesne düzeyindeki izinler için şu anda django-guardian kullanıyorum. POST iletisi, yalnızca URL'den çıkarılabileceği gibi şirketin adını içermeyen yeni yerin adını içerir. Bu durumda izinleri doğru bir şekilde uygulamak için zor bir zaman geçiriyorum. Yeni Location nesnesinin company nesnesini viewset'in pre_save yönteminden ayarlıyordum, ancak bu, izin denetiminin uygulanabilmesi için çok geç.

Bunu uygulamak için en iyi yol nedir? Orada durumda

kullanıcı POST şirket bulunuyor, ben viewset aşağıdaki ekleyerek şirketi doğrulayabilir:

def get_queryset(self): 
    parent = super(LocationViewSet, self).get_queryset()  
    return parent.filter(company__slug=self.kwargs['company_slug']) 
+0

Bunun için bir çözüm buldunuz mu? – Gabriel

+0

@alex Şirket sümüğünü nasıl pre_save yöntemine aldınız? Ben de gerçek soru – Neil

+0

cevabını arıyorum Ben urls ve görünümleri ve serializer yayınlayabilir miyim? –

cevap

0

Eh, ben aslında bunu yapmak için oldukça çirkin yolunu buldu , ana nesneyi almak ve isteğin kullanıcısına ait olduğunu kontrol etmek.

def create(self, request, *args, **kwargs): 
    request.data['catspad'] = kwargs['catspad_pk'] 
    if not Catspad.objects.get(id=kwargs['catspad_pk']).owner == request.user: 
     return Response(status=HTTP_401_UNAUTHORIZED) 
    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=HTTP_201_CREATED, headers=headers)