Django 休息框架 : Pagination with annotated Queryset

标签 django django-rest-framework

我目前正在做一个需要分页的项目。向用户提供图像列表以及它们是否被用户收藏。

收藏的图片保存在单独的表格中。

为了提供图像列表和用户收藏的图像的注释。

    def _get_queryset(self, request):
      user_favorited = DjImagingImagefavorites.objects.filter(ifv_img_recordid__exact=OuterRef('pk'), ifv_user_id__exact=request.user.profile)
      queryset = DjImagingImage.objects.all().annotate(favorited=Exists(user_favorited))
      return queryset

然后在列表函数中

    def list(self, request):
      images = self._get_queryset(request)
      page = self.paginate_queryset(images) #Breaks here

然后查询会抛出一个错误。 ]不能在用于 GROUP BY 子句的分组依据列表的表达式中使用聚合或子查询。

由于 paginate 函数执行计数和构造非法 sql 语句的方式很奇怪。

问题是 - 他们是做这件事的更好方法还是应该像我认为的那样完美地工作?

最佳答案

我找到的解决方案编码如下

 def list(self, request):
   images = self._get_queryset(request)
   #page = self.paginate_queryset(images)
   return self.paginate(images)

我创建了一个名为 paginate 的包装器

def paginate(self, queryset):
    """Calculate paginated QuerySet and wrap in a Response.

    Args:
        queryset - the queryset to be paginated
    """
    page = self.paginate_queryset(queryset)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        return self.get_paginated_response(serializer.data)
    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)

对于那些想知道我正在构建的查询集的人

def get_queryset(self):
    """Return the modified/prepared master QuerySet.

    Returns:
        QuerySet<DjImagingImage>: The modified master QuerySet

    """
    return DjImagingImage.objects.annotate(
            mine=FilteredRelation('djimaginguserspecifics',condition=Q(djimaginguserspecifics__usp_emp_employeeid=self.request.user.profile)),
            usp_favorite=F('mine__usp_favorite'),
            usp_inhistory=F('mine__usp_inhistory'),
            usp_emp_employeeid=F('mine__usp_emp_employeeid'),
            usp_lastviewed=F('mine__usp_lastviewed'),
            comment_count=Count('djimagingimagecomment'))

关于Django 休息框架 : Pagination with annotated Queryset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56551941/

相关文章:

python - 如何同时在模式和无模式模式下使用Django HStore DictionaryField?

Django 模板过滤器 : counting objects

Django 渴望加载多对多

python - .po 文件中的 Django 生成的波兰语复数形式不起作用

python - 重写基于泛型类的从 URL 参数查找对象的方式

python - Rest 框架中的 HTML 输入目前不支持列表

Django 迁移无法将用户实例分配给用户字段

python - Django - 如何将 DeleteView 限制为对象所有者

python - 没有主键如何进行PUT请求?

python - DRF 序列化程序中多个查找字段的自定义超链接 URL 字段