Несколько параметров в методе уничтожения DRF ModelViewset

avatar
OSCAR ANDRE PAREDEZ URIZAR
9 августа 2021 в 00:52
130
0
0

Я пытаюсь удалить продукт из списка желаний определенного пользователя. Я попытался использовать для этого метод уничтожения ModelViewSet, но, конечно, потерпел неудачу. Дело в том, что мне нужно отправить два параметра моему методу уничтожения, поэтому общее представление не сработает. Есть ли способ решить эту проблему?

Вот что я пытался сделать:

class WishlistViewSet(viewsets.ModelViewSet):
serializer_class = WishlistSerializer

# get_queryset and create methods here

def destroy(self, request, *args, **kwargs):

    post_data = request.data

    selected_user = User.objects.get(pk=int(post_data['user_id']))
    selected_producto = Catalogo.objects.get(pk=int(post_data['producto_id']))

    product_in_wishlist = Wishlist.objects.get(id_catalogo_producto=selected_producto, id_cliente=selected_user)
    product_in_wishlist.delete()

    return Response({'message': 'Producto eliminado de tu lista de deseos'})

Это мой urls.py для этого приложения:

router = DefaultRouter()
router.register('wishlist', WishlistViewSet, basename='wishlist')

urlpatterns = [
    path('', include(router.urls)),
]

Решение

Оказывается, подход, который лучше всего сработал для меня, заключается в том, чтобы сначала выполнить запрос на получение, чтобы получить идентификатор строки списка желаний. Затем запрос на удаление с этим идентификатором работал отлично.

Источник
HuLu ViCa
9 августа 2021 в 00:59
0

Каков результат, который вы получаете с вашим кодом?

OSCAR ANDRE PAREDEZ URIZAR
9 августа 2021 в 01:01
0

"detail": "Метод \"DELETE\" не разрешен." Это связано с тем, что мой тип URL-адреса не поддерживает метод удаления, который является маршрутизатором с зарегистрированными наборами представлений. Но я также не могу найти подход к документации DRF.

HuLu ViCa
9 августа 2021 в 01:02
0

Можете ли вы поделиться соответствующим urls.py? пожалуйста

OSCAR ANDRE PAREDEZ URIZAR
9 августа 2021 в 01:04
0

Готово мой друг.

HuLu ViCa
9 августа 2021 в 01:14
0

Можете ли вы отправить другие запросы на конечную точку, например GET?

OSCAR ANDRE PAREDEZ URIZAR
9 августа 2021 в 01:19
0

Да. Get и Post работают, а Delete нет из-за типа URL, в данном случае это /store/wishlist/.

Andrew
9 августа 2021 в 21:19
0

DELETE — это глагол, который работает с URL-адресом, в вашем случае /wishlist/<int:id>/, как это предусмотрено ViewSet. То, что вы хотите сделать здесь, это просто отправить некоторые данные в конечную точку, что не является правильным использованием метода destroy. Возможно, вы используете @action в наборе представлений, создавая /wishlist/remove/ и передавая ожидаемый запрос, и вы даже можете проверить его с помощью сериализатора в методе.

Ответы (0)