Есть ли способ иметь действие с detail = True внутри другого действия с detail = True в Django rest?

Моя модель пользователя имеет отношение "много к одному" к модели одежды, и внутри набора представлений User я создал дополнительное действие, чтобы перечислить экземпляры одежды по отношению к определенному пользователю

@action(detail=True, methods=['get'], serializer_class=UserOutfitSerializer)
def outfit (self, request, pk=None):
    user = User.objects.get(id=pk)
    clothes = user.clothes_set.all()
    serializer = UserOutfitSerializer(user.clothes_set.all(), many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

Можно ли сделать еще одно дополнительное действие для восстановления/обновления/удаления каждого экземпляра одежды для этого пользователя ('http://127.0.0.1:8000/api/users/user_id/outfit/clothes_id') и если да, то будет ли это плохой практикой?

Вы можете добавить еще одно действие, которое имитирует название вашего действия листинга, и заменить url_path действия по умолчанию на "подробно в деталях", которое вы хотите.

@action(detail=True, methods=['GET'], url_path=r'outfit/(?P<cloth_id>\d+)')
def outfit_retrieve(self, request, pk, cloth_id):
    user = self.get_object()
    cloth = get_object_or_404(user.clothes_set.all(), id=cloth_id)
    serializer = UserOutfitSerializer(cloth)
    return Response(serializer.data, status=status.HTTP_200_OK)

@action(detail=True, methods=['POST'], url_path=r'outfit/(?P<cloth_id>\d+)')
def outfit_add(self, request, pk, cloth_id):
    user = self.get_object()
    cloth = get_object_or_404(Cloth.objects.all(), id=cloth_id)
    user.clothes_set.add(cloth)
    serializer = UserOutfitSerializer(cloth)
    return Response(serializer.data, status=status.HTTP_200_OK)
Вернуться на верх