Django Rest框架自定义动作的URL不起作用



我的视图中有以下自定义操作:

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')

但是当运行测试时,我得到以下错误:

importterror: Failed to import test module: orders。测试回溯(最近一次通话最后一次):文件/usr/local/lib/python3.7/unittest/loader.py",第436行_find_test_pathmodule = self._get_module_from_name(name) File "/usr/local/lib/python3.7/unittest/loader.py",第377行,in_get_module_from_name文件"/app/orders/tests.py",第22行ORDERS_ADD_URL = reverse('order-add')文件"/usr/local/lib/python3.7/site-packages/django/urls/base.py"相反返回iri_to_uri(解析器。文件"/usr/local/lib/python3.7/site-packages/django/urls/resolvers.py";第685行,在_reverse_with_prefixdjango.urls.exceptions. noreverematch: 'order-add'的反转,没有找到参数。2模式(年代)尝试:['命令/(? P[^/] +)/添加。(? P [a-z0-9] +)/?美元",的订单/(? P[^/] +)/添加/美元)

---------------------------------------------------------------------- 跑1测试在0.000 s

失败(错误= 1)

根据文档,我不需要注册这个端点,路由器应该自己做。我错过了什么?

您错过的第一件事是反向的pk。由于add API需要Order对象的pk,因此需要将其传递给反转函数。例如:

order_add_url = reverse('order-add', kwargs={'pk': 1})
print(order_add_url)  # which will print '/orders/1/add/'

所以我认为你应该把这部分移动到PublicOrderApiTests的方法体,因为你需要一个动态的url每个测试对象。

另一个问题是ViewSet类不支持self.get_object(),如果你想使用这个方法,你应该有你自己的方法或使用rest框架GenericViewSet(即from rest_framework.viewsets import GenericViewSet和继承从这个类而不是ViewSet),然后你可以访问get_object()方法。你也可以在rest框架文档中阅读更多关于通用视图的内容。

相关内容

  • 没有找到相关文章

最新更新