Drf - trailing / в url вызывает ошибку при вызове post api

views.py

class FurnitureViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    permission_classes = [AllowAny]
    serializer_class = FurnitureSerializer
    queryset = Furniture.objects.all()

@nested_view_set(FurnitureViewSet, 'furniture_id')
class TablesViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
    permission_classes = [AllowAny]
    serializer_class = TableSerializer
    queryset = Table.objects.all()

class OrdersViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, GenericViewSet):
    authentication_classes = []
    permission_classes = [AllowAny]
    queryset = Orders.objects.all()

urls.py

router = ExtendedSimpleRouter()
furniture_router = router.register('furnitures', FurnitureViewSet, basename='furnitures')
furniture_router.register('tables', TablesViewSet, basename="tables",parents_query_lookups=['furniture_id'])
order_router = router.register('orders', OrdersViewSet, basename="orders")

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

Я создал несколько apis для интеграции с третьими сторонами в моем проекте.
Апи мебели и столов работают нормально, когда вызываются с их тестового портала.
Order post api вызывается как someurl.url/orders, что приводит к 500 ошибке.

You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to someurl.url/orders/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

Доступ к apis осуществляется другой организацией и тестируется через их портал, поэтому я не могу изменить структуру и не могу изменить настройки всего проекта только для 3 apis. Как я могу решить проблему с url и при этом использовать ExtendedSimpleRouter, поскольку я использую вложенные наборы представлений?

Измените URL на someurl.url/orders/ и попробуйте снова, Или добавьте APPEND_SLASH=False в файл настроек.

Я решил проблему, используя re_path в urls.py

router = ExtendedSimpleRouter()
furniture_router = router.register('furnitures', FurnitureViewSet, basename='furnitures')
furniture_router.register('tables', TablesViewSet, basename="tables",parents_query_lookups=['furniture_id'])

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

    re_path(r'^orders/?$', OrdersViewSet.as_view({
        'post': 'create'
    }), name="orders-list"),

    path('orders/<id>', OrdersViewSet.as_view({
        'patch': 'partial_update',
    }), name="order-detail")
]
Вернуться на верх