Django restframework generics.ListCreateAPIView返回类似对象的列表

时间:2016-06-08 10:25:59

标签: django django-rest-framework

class UserProfileView(generics.ListCreateAPIView):
    permission_classes = (
    permissions.IsAuthenticated,
    )
    serializer_class = UserProfileSerializer

    def list(self,request):
        queryset = UserProfile.objects.filter(user=request.user.id)
        serializer = UserProfileSerializer(queryset, many=True)
        return Response(serializer.data)

我已经像这样拉出来了

[
  {
    "id": 1,
    "firstname": "exp",
    "lastname": "exp"
  }
]

我想要这样,我怎么能这样做而且我不知道为什么它会像对象一样返回列表,我该如何解决这个问题

{
    "id": 1,
    "firstname": "exp",
    "lastname": "exp",
}

1 个答案:

答案 0 :(得分:3)

ListCreateAPIView旨在返回对象列表。

像这样的表示

{
    "id": 1,
    "firstname": "exp",
    "lastname": "exp",
}

表示您想要一个对象,而不是对象列表,这意味着您需要使用RetrieveAPIView

来获取所需的对象

没有RetrieveCreateAPIView,但您可以使用RetrieveModelMixin

轻松制作

喜欢这个

from rest_framework import mixins, generics

class UserProfileView(mixins.RetrieveModelMixin, generics.CreateAPIView):
    permission_classes = (
        permissions.IsAuthenticated,
    )
    serializer_class = UserProfileSerializer

    # Custom get_object method which is gets from request
    # instead of queryset
    def get_object(self, queryset=None):
        return UserProfile.objects.get(user=self.request.user)

    # You can look this up in RetrieveAPIView
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

<强>更新

您需要重载get_object方法,默认情况下get_object将查看传递的url参数并尝试从提供的查询中获取对象。这样做是CRUDL用法的通用。之后,get_object返回的值用于实例化serializer_class。但在您的情况下,您需要返回request中的当前用户。查看更新的答案。如果您查找retrieve方法重新启动,则可以理解所有这些信息。对于开发人员来说,了解如何阅读源代码是必不可少的技能。