Django Rest Framework 路由:找不到 'orders' 的反向。 'orders' 不是有效的视图函数或模式名称
Django Rest Framework Routing: Reverse for 'orders' not found. 'orders' is not a valid view function or pattern name
我不太确定我是否理解路由在 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)
这是我应用中的 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
这是主要的 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)
但是当我尝试通过简单测试访问 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)
我收到以下错误:
django.urls.exceptions.NoReverseMatch: Reverse for 'orders' not found.
'orders' is not a valid view function or pattern name.
我做错了什么?产品的端点工作正常,但不适用于订单。
在这种情况下发现问题:
在我的测试中,我定义了错误的参数来获取 url,因此需要 ORDERS_URL = reverse('order-list')
而不是 ORDERS_URL = reverse('orders')
。 *-list
用于 GET /orders/
和 POST /orders/
而 *-detail
用于所有其他端点:PUT /orders/{id}
GET /orders/{id}
等
我认为的方法是 post
但我继承的 ViewSet
没有那个方法,它有 create
方法,所以我需要将 post
重命名为 create
我不太确定我是否理解路由在 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)
这是我应用中的 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
这是主要的 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)
但是当我尝试通过简单测试访问 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)
我收到以下错误:
django.urls.exceptions.NoReverseMatch: Reverse for 'orders' not found. 'orders' is not a valid view function or pattern name.
我做错了什么?产品的端点工作正常,但不适用于订单。
在这种情况下发现问题:
在我的测试中,我定义了错误的参数来获取 url,因此需要
ORDERS_URL = reverse('order-list')
而不是ORDERS_URL = reverse('orders')
。*-list
用于GET /orders/
和 POST/orders/
而*-detail
用于所有其他端点:PUT /orders/{id}
GET /orders/{id}
等我认为的方法是
post
但我继承的ViewSet
没有那个方法,它有create
方法,所以我需要将post
重命名为create