我的视图中有以下自定义操作:
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框架文档中阅读更多关于通用视图的内容。