python - 必须使用 WorkoutList 实例作为第一个参数来调用未绑定(bind)方法 get_queryset() (什么也没得到)

标签 python django pagination django-rest-framework

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

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

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。一个小示例链接将会有所帮助

最佳答案

你在这里做了一些非常奇怪的事情。

如果您对 View 进行子类化,则应该在 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()

编辑 我猜分页不起作用,因为您是从空白的锻炼查询开始,而不是使用 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

关于python - 必须使用 WorkoutList 实例作为第一个参数来调用未绑定(bind)方法 get_queryset() (什么也没得到),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36688843/

相关文章:

c# - C# 和 Python 之间的命名管道

python - 启用插件时pyqt4段错误(核心转储)

django - 如何检查@api_view函数的object_permissions?

java - GWT 多分页(最好/最简单的方法)

ruby - Ruby/Rails 中的每个持久计数器

sql-server - 在 SQL Server 中分页时保留总结果信息

python - 如何使用 Python 查找(和抓取)给定域中的所有网页?

python - Django 有足够的脚手架吗? (à la Ruby on Rails)

Python导入错误 "DLL load failed"| Python

python - 沿二维数组中的对角线和反对角线求和 - NumPy/Python