我正在尝试设置一个返回单个对象的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
和一个过滤器返回一个商品,因为每个用户都有一个购物车。
问题是filter
函数返回一个查询集,但我只想要一项。
我尝试使用RetrieveModelMixin
,但它不能在我想要的端点上运行。Retrieve在.../api/shopping-cart/id
上运行,但我想在.../api/shopping-cart
上进行检索,因为过滤是通过登录的人完成的。
有什么解决方案吗?
发布于 2019-09-12 21:27:51
我最终解决它的方法仍然是使用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/ root cart,而不必传递参数,因为它根据用户进行过滤。
发布于 2019-09-10 11:22:38
我不确定你是否已经尝试过了,但它应该是值得的(尽管我不确定它是否有效)
def get_queryset(self):
return ShoppingCart.objects.filter(user=self.request.user)[:1]
发布于 2019-09-10 11:43:43
为什么不使用简单的api视图而不是视图集类?
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 (在urls.py
中),而不是路由器url。
https://stackoverflow.com/questions/57869616
复制