必须使用WorkoutList实例作为第一个参数调用未绑定方法get_queryset()(没有任何内容)

时间:2016-04-18 08:25:06

标签: python django pagination django-rest-framework

我正在通过现有的Web服务(RESTful API)实现DRF的分页。现在我从DRF分页的文档中了解到,分页是自动应用于ListCreateAPIView,只需要在settings.py文件中添加一些行。

所以我根据文档进行了更改,对于我的webservice,我希望我的查询集是动态的。 以下是所做的更改:

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:我有问题但是无法找到合适的解决方案。

我还想在DRF中实现OffsetLimitPagination。一个小示例链接将有所帮助

1 个答案:

答案 0 :(得分: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()

编辑我认为分页不起作用,因为您从空白的Workout查询开始,而不是使用超级调用中返回的值。所以你应该这样做:

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