0

在我看来,我有以下自定义操作:

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(名称)文件“/usr/local/lib/python3.7/unittest/loader.py”,第 377 行,在 _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”,第 87 行,反向返回 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 中引发 NoReverseMatch(msg) django.urls.exceptions.NoReverseMatch: 为 'order-add' 反向,未找到任何参数。尝试了 2 种模式:['orders/(?P[^/.]+)/add\.(?P[a-z0-9]+)/?$', 'orders/(?P[^ /.]+)/加/$']

-------------------------------------------------- -------------------- 在 0.000 秒内运行 1 次测试

失败(错误=1)

根据我不需要注册此端点的文档,路由器应该自己完成。我错过了什么?

4

1 回答 1

2

你错过的第一件事是pk在你的反面。由于添加 API 需要pk您的 Order 对象,因此您需要将其传递给 reverse 函数。例如:

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

因此,我认为您应该将此部分移至PublicOrderApiTests's 方法的主体,因为您需要每个测试对象的动态 url。

另一个问题是ViewSet该类不支持self.get_object(),如果您想使用此方法,您应该拥有自己的方法或使用 rest 框架GenericViewSet(即from rest_framework.viewsets import GenericViewSet从此类继承而不是继承ViewSet)然后您可以访问该get_object()方法。您还可以在rest framework docs中阅读有关通用视图的更多信息。

于 2021-03-02T05:36:24.063 回答