0

我正在尝试设置一个返回单个对象的 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因为过滤是通过登录的人完成的。

有什么解决办法吗?

4

3 回答 3

0

我最终解决它的方式仍然是使用 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 上返回一个单数项,而无需传递参数,因为它基于用户进行过滤。

于 2019-09-12T21:27:50.590 回答
0

我不确定你是否尝试过这个,但它应该是值得的(虽然我不确定它是否会起作用)

def get_queryset(self):
    return ShoppingCart.objects.filter(user=self.request.user)[:1]
于 2019-09-10T11:22:38.430 回答
0

为什么不使用简单的 api 视图而不是 viewset 类?

from django.http import Http404
from rest_framework import status, views

class ShoppingCartAPIView(views.APIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def get_object(self):
        # use .get if you are really sure it can only be one shopping cart per user
        try:
            return ShoppingCart.objects.get(user=self.request.user)
        except ShoppingCart.DoesNotExist:
            raise Http404()

    def get(self, request):
        obj = self.get_object()        
        data = ShoppingCartSerializer().to_representation(obj)
        return Response(data, status=status.HTTP_200_OK)

您甚至可以为其他 http 方法创建逻辑,例如post, delete

然后将 url 模式添加api/shopping-cart为普通 url (in urls.py),而不是路由器。

于 2019-09-10T11:43:43.160 回答