5

nested router extension과 함께 장고 REST 프레임 워크를 사용하고 있습니다. 내 경로 중 하나는 다음과 같습니다. companies/$company/locations/$location$company$location은 슬러그 변수입니다.중첩 된 경로에 대한 Django REST 권한

사용자가이 URL에 POST 할 수 있도록 허용하려면 companies/$company/locations/ 새 위치를 추가하십시오. 나는 POST를하는 사용자가 POST 할 회사에 대한 수정 권한을 갖고 있는지 확인하고자합니다. 현재 내 개체 수준 사용 권한은 django-guardian입니다. POST 메시지에는 URL에서 추측 할 수있는 회사 이름이 포함되지 않은 새 위치의 이름 만 포함됩니다. 이 경우 권한을 올바르게 적용하는 데 어려움을 겪고 있습니다. 나는 새 Location 객체의 필드를 뷰셋의 pre_save 메소드에서 설정 했었지만 권한 확인이 적용 되기에는 너무 늦었습니다.

이것을 시행하는 가장 좋은 방법은 무엇입니까? 이 경우

는 사용자가 POST에있는 회사가 포함되어 있지 않습니다, 나는이 (가) 뷰셋에 다음을 추가하여 회사의 유효성을 검사 할 수 있습니다 :

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

혹시 해결 방법을 찾았습니까? – Gabriel

+0

@alex 어떻게 pre_save 메소드에서 회사 슬러그를 얻었습니까? 나는 또한 실제 질문에 대한 답변을 찾고있다 – Neil

+0

URL과 뷰 및 시리얼 라이저를 게시 할 수 있습니까? –

답변

0

음, 사실이 작업을 수행하는 다소 추한 방법을 발견 , 부모 개체를 검색하고 요청의 사용자에 대한 소유 여부를 확인합니다.

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) 
관련 문제