Хочу сделать API со следующей структурой:
/user - данные пользователя
/user/companies - список компаний пользователя
/user/companies/1 - конкретная компания
/user/companies/1/contacts - список контактов компании
/user/companies/1/contacts/2 - конкретный контакт
Хочу всё сделать на ViewSet, но сталкиваюсь с тем, что приходиться переопределять методы, чтобы "пробросить" company_id.
class PhotosViewSet(viewsets.ModelViewSet):
serializer_class = serializers.CompanyPhotoSerializer
queryset = models.CompanyPhoto.objects.all()
permission_classes = [permissions.IsOwnerOrReadOnly]
def list(self, request, *args, **kwargs):
queryset = self.queryset.filter(company_id=kwargs['company_id'])
serializer = self.serializer_class(queryset, many=True)
return response.Response(serializer.data)
def retrieve(self, request, *args, **kwargs):
queryset = self.queryset.filter(company_id=kwargs['company_id'])\
.get(id=kwargs['pk'])
serializer = self.serializer_class(queryset)
return response.Response(serializer.data)
Соответственно мне так придеться переписать большинство вьюсетов и их методов. А тут уж проще обычные вьюхи использовать. Подскажите как это можно сделать элегантнее? Рассмотрю все варианты, включая CBV и так далее.
UPD: Вычитал про
lookup_url_kwarg в Generic views, но жду ещё варианты.