Django Rest框架:使用带注释的Queryset进行分页

Django Rest框架:使用带注释的Queryset进行分页,django,django-rest-framework,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

我目前正在做一个项目,需要分页。将向用户提供图像列表,以及用户是否喜欢这些图像

喜爱的图像保存在单独的表中

为了提供图像列表和用户喜欢的图像列表,请添加注释

    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
然后在list函数中

    def list(self, request):
      images = self._get_queryset(request)
      page = self.paginate_queryset(images) #Breaks here
然后查询抛出一个错误。 ]无法在group by子句的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'))
def get_queryset(self):
“”“返回修改/准备好的主查询集。”。
返回:
QuerySet:修改后的主QuerySet
"""
返回djimagimage.objects.annotate(
mine=FilteredRelation('djImageGuserSpecifics',condition=Q(djImageGuserSpecifics\uuuuUSP\uEMP\uEmployeeId=self.request.user.profile)),
usp\u favorite=F(“我的usp\u favorite”),
usp\u inhistory=F(“我的usp\u inhistory”),
usp_emp_employeeid=F('mine_usp_emp_employeeid'),
usp_lastviewed=F('mine_usp_lastviewed'),
comment_count=count('djImageComment'))