Django Rest Framework 路由:未找到“订单”的反向操作。“orders”不是有效的视图函数或模式名称

Seb*_*ond 1 django-urls django-views django-rest-framework django-rest-viewsets django-url-reverse

我不太确定我是否理解路由在 DRF 中的工作原理。我浏览了文档,但仍然没有掌握其中的差异。

我有以下观点:

from django.shortcuts import render
from django.shortcuts import get_object_or_404

from rest_framework.viewsets import ViewSet
from rest_framework.response import Response


from .models import Order
from .serializer import OrderSerializer


class OrderAPIViewSet(ViewSet):

    def post(self, request):
        print(request)
Run Code Online (Sandbox Code Playgroud)

这是urls.py在我的应用程序中:

from django.urls import include, path
from rest_framework import routers
from .views import OrderAPIViewSet


router = routers.DefaultRouter()
router.register(r'orders', OrderAPIViewSet, basename='order')
urlpatterns = router.urls
Run Code Online (Sandbox Code Playgroud)

这是主要的urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('products.urls')),
    path('', include('orders.urls'))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)

orders但是当我尝试通过简单的测试访问端点时:

ORDERS_URL = reverse('orders')


class PublicOrderApiTests(TestCase):
    """
    Test the public facing Order API
    """

    def setUp(self):
        self.client = APIClient()
    

    def test_sample(self):

        data = {
            "product_id": 1,
            "price": 5.80
        }

        res = self.client.post(ORDERS_URL, data)

        print(res)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

django.urls.exceptions.NoReverseMatch:未找到“订单”的反向。“orders”不是有效的视图函数或模式名称。

我究竟做错了什么?产品的端点工作得很好,但订单的端点却不行。

Seb*_*ond 5

在这种情况下发现了一个或多个问题:

  1. 在我的测试中,我定义了错误的参数来获取 url,因此ORDERS_URL = reverse('orders')需要将ORDERS_URL = reverse('order-list'). *-list用于GET /orders/和 POST/orders/*-detail用于所有其他端点:PUT /orders/{id} GET /orders/{id}

  2. 在我看来,该方法是post,但ViewSet我继承的方法没有该方法,而是有该create方法,所以我需要将其重命名postcreate