【问题标题】:unbound method get_queryset() must be called with WorkoutList instance as first argument (got nothing instead)必须使用 WorkoutList 实例作为第一个参数调用未绑定的方法 get_queryset()(什么都没有)
【发布时间】:2016-04-18 17:01:28
【问题描述】:

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

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

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(双关语)这个问题,但找不到正确的解决方案。

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

【问题讨论】:

    标签: python django pagination django-rest-framework


    【解决方案1】:

    你在这里做了几件非常奇怪的事情。

    如果您将视图子类化,您应该在 url 中使用该子类,而不是原始类的奇怪混搭和子类中的方法。所以:

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

    一旦你解决了这个问题,你就会在你的 get_queryset 方法中陷入无限递归。同样,当你继承子类时,如果你想调用你使用的原始实现 super;您不会初始化当前类的另一个实例并尝试调用该方法,因为它将是 same 方法。

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

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

    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
    

    【讨论】:

    • 啊,我没有注意到您还覆盖了 list 方法。没有必要这样做;完全删除该方法。
    • 我完全错过了我必须添加用户的 ID,即来自 URL 的 pk。我试过 Workout.objects.filter(created__contains=date,user = self.args['pk']) 。但无法让它工作
    • pk 肯定是 WorkoutList 的主键,而不是 User?我猜你想要user=self.request.user。如果这不起作用,请发布一个新问题。
    • 我阅读了您对另一个问题的回答。我刚刚使用self.kwargs['pk']
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2017-12-23
    • 1970-01-01
    • 2018-01-06
    相关资源
    最近更新 更多