Есть ли способ иметь действие с 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)