Django Rest Framework@detail_route生成404

2024-04-19 10:14:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个ViewSet

class CustomerViewSet(ModelViewSet):
    queryset = models.Customer.objects.all()
    serializer_class = serializers.CustomerSerializer
    filter_class = filters.CustomerFilterSet

    @detail_route
    def licenses(self, request, pk=None):
        customer = self.get_object()
        licenses = Item.objects.active().sold().for_customer(customer)
        serializer = serializers.ItemSerializer(licenses, many=True)
        return Response(serializer.data)

router.register(r'customers', views.CustomerViewSet)捆绑到urls.py

我可以GET /api/customersGET /api/customers/1000,但找不到{}。它给了我404。流从不进入licenses方法。在

我在这里看到了类似的问题,但是他们使用了一个不正确的签名,我没有:def licenses(self, request, pk=None)

^{pr2}$

编辑:再一次,我问了不到一分钟就找到了我的答案。。。显然,装饰器需要像@detail_route()这样的括号。我以为这些都是按惯例选择的。。?在


Tags: selfnoneobjectsrequestdefcustomerrouteclass
2条回答

对于post请求,您需要指定方法,因为默认情况下,detail_route装饰器将路由get请求。 像这样:@detail_route(methods=['POST'])

默认情况下,router会在url中添加尾部斜杠。因此,GET /api/customers/将代替GET /api/customers工作。如果不想使用尾随斜杠,可以将trailing_slash = False传递给路由器初始值设定项。在

例如-

router = DefaultRouter(trailing_slash = False)
router.register(r'customers', views.CustomerViewSet)

如果这不起作用,那么您将路由器url导入主url的方式就有问题了。在

相关问题 更多 >