【发布时间】:2021-05-31 14:56:39
【问题描述】:
我的视图中有以下自定义操作:
class OrderAPIViewSet(viewsets.ViewSet):
def create(self, request):
print("Here: working")
@action(detail=True, methods=['post'])
def add(self, request, *arg, **kwargs):
print("HERE in custom action")
order = self.get_object()
print(order)
我的应用程序的urls.py 是:
from rest_framework import routers
from .views import OrderAPIViewSet
router = routers.DefaultRouter()
router.register(r'orders', OrderAPIViewSet, basename='order')
urlpatterns = router.urls
所以在我的测试中,当我尝试访问orders/post 时它可以工作,但是当我尝试访问orders/{pk}/add 时它失败了。我的意思是,反过来本身就失败了:
ORDERS_LIST_URL = reverse('order-list')
ORDERS_ADD_URL = reverse('order-add')
class PublicOrderApiTests(TestCase):
def test_sample_test(self):
data = {}
res = self.client.post(ORDERS_ADD_URL, data, format='json')
正如我之前所说,我有一个单独的测试,我像这样使用ORDERS_LIST_URL:
res = self.client.post(ORDERS_LIST_URL, data, format='json')
但是在运行测试时出现以下错误:
ImportError:导入测试模块失败:orders.tests Traceback (最近一次通话最后):文件 “/usr/local/lib/python3.7/unittest/loader.py”,第 436 行,在 _find_test_path 模块 = self._get_module_from_name(name) 文件“/usr/local/lib/python3.7/unittest/loader.py”,第 377 行,在 _get_module_from_name import(名称)文件“/app/orders/tests.py”,第 22 行,在 ORDERS_ADD_URL = reverse('order-add') 文件“/usr/local/lib/python3.7/site-packages/django/urls/base.py”,第 87 行, 相反 return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)) 文件 "/usr/local/lib/python3.7/site-packages/django/urls/resolvers.py", 第 685 行,在 _reverse_with_prefix raise NoReverseMatch(msg) django.urls.exceptions.NoReverseMatch:“order-add”的反向,没有找不到参数。 2 个图案 试过:['orders/(?P[^/.]+)/add\.(?P[a-z0-9]+)/?$', '订单/(?P[^/.]+)/add/$']
----------------------------------- ----------------------- 在 0.000 秒内运行 1 次测试
失败(错误=1)
根据文档我不需要注册这个端点,路由器应该自己做。我错过了什么?
【问题讨论】:
-
在模块级别删除
reverse(...)的使用并将其带到您的班级级别
标签: django django-rest-framework django-urls django-rest-viewsets django-url-reverse