2016-04-18 58 views
1

我正在通過現有的Web服務(RESTful API)實現DRF的分頁。現在我從DRF分頁文檔中學到了分頁是自動應用於ListCreateAPIView的,只需要在settings.py文件中添加一些行。unbound方法get_queryset()必須以WorkoutList實例作爲第一個參數調用(沒有任何代替)

所以我根據文檔和我的web服務做了更改,我希望我的queryset是動態的。 下面是修改完成:

urls.py

url(r'^users/(?P<pk>[0-9]+)/workouts/get/$', 
     ListCreateAPIView.as_view(WorkoutList.get_queryset(), serializer_class=WorkoutSerializer), name='list'), 

views.py

class WorkoutList(generics.ListCreateAPIView): 
    queryset = Workout.objects.all() 
    serializer_class = WorkoutSerializer 
    permission_classes = (UserPermissions,) 

    def get_queryset(self): 
     workout_instance = WorkoutList() 
     workout_instance.get_queryset() 
     query_params = self.request.QUERY_PARAMS.dict() 
     if 'date' in query_params and 'exclude_app_install_time' in query_params: 
      query_set = Workout.objects.filter(created__contains=date).exclude(
       app_install_time=query_params['exclude_app_install_time']) 
     else: 
      query_set = {} 
     return query_set 

    def list(self, request, *args, **kwargs): 
      workouts = self.get_queryset() 
      serializer = WorkoutSerializer(workouts, many=True) 
      return Response(serializer.data) 

PS:我已經stackoverflowed(雙關語intented)的問題,但不能找到正確的解決方案。

另外我想在DRF中實現OffsetLimitPagination。一個小例子的鏈接將有幫助

回答

1

你在這裏做了一些非常奇怪的事情。

如果您爲視圖創建子類,則應該在url中使用該子類,而不是原始類和子類中的方法的奇怪混搭。所以:

url(r'^users/(?P<pk>[0-9]+)/workouts/get/$', 
     WorkoutList.as_view(serializer_class=WorkoutSerializer), name='list'), 

一旦解決了這個問題,您將在get_queryset方法中進入無限遞歸。同樣,當你繼承子類時,如果你想調用原來的實現,你使用super;您不會初始化當前類的另一個實例並嘗試調用該方法,因爲這將是相同的方法。

def get_queryset(self): 
    query_set = super(WorkoutList, self).get_queryset() 

編輯我猜,因爲你是從一個空白的鍛鍊查詢開始,而不是使用從超級調用返回的值分頁不起作用。所以你應該這樣做:

def get_queryset(self): 
    query_set = super(WorkoutList, self).get_queryset() 
    query_params = self.request.QUERY_PARAMS.dict() 
    if 'date' in query_params and 'exclude_app_install_time' in query_params: 
     query_set = query_set.filter(created__contains=date).exclude(
      app_install_time=query_params['exclude_app_install_time']) 
    return query_set 
+0

啊,我沒有注意到你也覆蓋了'list'方法。沒有必要那樣做;完全刪除該方法。 –

+0

我完全錯過了我必須添加用戶的Id,即從URL URL。我嘗試了'Workout.objects.filter(created__contains = date,user = self.args ['pk'])''。但無法讓它工作 –

+1

當然'pk'是WorkoutList的主鍵,而不是用戶?我想你想'user = self.request.user'。如果這不起作用,請發佈一個新問題。 –

相關問題