首页 > 解决方案 > Django Rest Framework:使用根 API 获取奇异对象

问题描述

我正在尝试设置一个返回单个对象的 API 端点。

现在我有:

class ShoppingCartViewSet(viewsets.GenericViewSet, mixins.ListModelMixin):
    """
    API endpoint that allows users to be viewed or edited.
    """
    serializer_class = ShoppingCartSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def get_paginated_response(self, data):
        return Response(data)

    def get_queryset(self):
        return ShoppingCart.objects.filter(user=self.request.user)

它使用ListModelMixin和 过滤器返回一件商品,因为每个用户都有 1 个购物车。

问题是该filter函数返回一个查询集,但我只想要一个项目。

我试图使用,RetrieveModelMixin但它没有在我想要的端点上运行。检索运行,.../api/shopping-cart/id但我想检索,.../api/shopping-cart因为过滤是通过登录的人完成的。

有什么解决办法吗?

标签: djangodjango-rest-frameworkmixinsdjango-rest-viewsets

解决方案


我最终解决它的方式仍然是使用 ListModelMixin,因为我需要从视图集中受益。

我用以下方法覆盖了该list()方法:

class ShoppingCartViewSet(viewsets.GenericViewSet, mixins.ListModelMixin):
    """
    API endpoint that allows users to be viewed or edited.
    """
    serializer_class = ShoppingCartSerializer
    # authentication_classes = (TokenAuthentication,)
    # permission_classes = (IsAuthenticated,)

    def get_paginated_response(self, data):
        return Response(data)

    def list(self, request, *args, **kwargs):
        instance = ShoppingCart.objects.get(user=self.request.user)
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

它在根 url .../api/shopping-cart 上返回一个单数项,而无需传递参数,因为它基于用户进行过滤。


推荐阅读