2016-06-08 119 views
1
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) 

我得出去拉这样Django的restframework generics.ListCreateAPIView返回类似的对象列表中

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

我想是这样,我怎么能做到这一点,我不知道为什么它返回列表我怎样才能解决这个问题

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

返回的结果是一个常规的模型架构,据我所知... – glls

+0

列表是检索* multiple *记录,Retrieve是针对单个的 - 他们有分开的方法:get_object() – Jerzyk

+0

@Jerzyk你可以给我任何例子如何做到这一点!!!!!! – thisisms

回答

2

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参数,并试图从提供queryest对象。它是这样做的,对于CRUDL的用法是通用的。之后,从get_object返回的值用于实例化serializer_class。但在你的情况下,你只需要返回当前用户request。查看更新的答案。如果您查找retrieve方法关联,所有这些信息都可以理解。对于开发人员来说,知道如何阅读源代码是必不可少的技能。

+0

如果我使用RetriveModelMixin没有得到这个视图的方法,我该如何解决这个问题。 – thisisms

+0

这很容易做到。我更新了我的答案。 –

+0

它不工作它是在抱怨queryset,如果我给一个查询集(它需要筛选用户ID)仍然是抛出“预期的视图UserProfileView被调用一个名为”pk“的URL关键字参数。修复你的URL conf或设置正确显示视图上的'.lookup_field'属性。“ – thisisms