Как отобразить метод патча на действие с detail=False в Django Rest Framework
Я создаю API с помощью Django и Django Rest Framework
У меня есть следующая конечная точка:
host/products/ указывает на ModelViewSet, так что у меня есть CRUD, работающий для указанной модели.
Кроме того, я определяю дополнительное действие для вложенной модели под названием config со следующим кодом:
@action(detail=False, methods=['get', 'post'])
def config(self, request, *args, **kwargs):
if request.method == 'GET':
return super().list(request, *args, **kwargs)
elif request.method == 'POST':
return super().create(request, *args, **kwargs)
Созданный URL имеет вид: host/products/config/
По этому URL я могу создавать и перечислять объекты во второй указанной модели
Проблема в том, что я хочу включить методы PATCH и DELETE для вложенного URL, то есть:
host/products/config/detail/
Я пытаюсь сделать что-то вроде этого:
@action(detail=True)
@config.mapping.patch
def update_config(self, request, *args, **kwargs):
return super().update(request, *args, **kwargs)
Но, конечно, это не работает...
Как я могу отобразить действие детали на другое действие в том же наборе представлений?
Полный код следующий:
class ProductViewSet(viewsets.ModelViewSet):
def get_permissions(self):
''' Assign permissions based on action. '''
if self.action in ['suggestions']:
permission_classes = [AllowAny]
else:
permission_classes = [AllowAny] # [IsAdminUser | IsDevUser]
return [permission() for permission in permission_classes]
def get_queryset(self):
''' Return queryset based on action. '''
if self.action == 'config':
# Return product details
return ProductDetails.objects.filter(active=True)
else:
# Return active products
return Product.objects.filter(active=True)
def get_serializer_class(self):
''' Return serializer based on action. '''
if self.action == 'suggestions':
return SurveySerializer
elif self.action == 'config':
return ProductDetailModelSerializer
else:
return ProductModelSerializer
@action(detail=False, methods=['get', 'post'])
def config(self, request, *args, **kwargs):
if request.method == 'GET':
return super().list(request, *args, **kwargs)
elif request.method == 'POST':
return super().create(request, *args, **kwargs)
@action(detail=True)
@config.mapping.patch
def update_config(self, request, *args, **kwargs):
return super().update(request, *args, **kwargs)