2016-06-08 121 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