Python 过滤Django时保留带注释的秩

Python 过滤Django时保留带注释的秩,python,django,postgresql,window-functions,Python,Django,Postgresql,Window Functions,我有一个过滤查询集,其中我根据特定顺序注释了每个对象的排名 然后,当我执行其他过滤器时,如按秩更改顺序,保持不变。执行新的.filter()时会出现问题 我在页面上有一个搜索功能,可以在对象标题后过滤结果。但当我这样做时,注释的秩值会根据新查询中的结果数量而变化,而不是保留其原始值 举例说明: 这是我的原始查询: choices\u filter=Choice.objects.filter(锦标赛=pk).注释\ (rank=RawSQL(“rank()结束(按winrate DESC、pick

我有一个过滤查询集,其中我根据特定顺序注释了每个对象的排名

然后,当我执行其他过滤器时,如按秩更改顺序,保持不变。执行新的.filter()时会出现问题

我在页面上有一个搜索功能,可以在对象标题后过滤结果。但当我这样做时,注释的秩值会根据新查询中的结果数量而变化,而不是保留其原始值

举例说明:

这是我的原始查询:

choices\u filter=Choice.objects.filter(锦标赛=pk).注释\
(rank=RawSQL(“rank()结束(按winrate DESC、pickrate DESC、播放次数排序)”,[]))
这将返回如下查询集:

Rank        Title         Winrate      
1...........Apple...........55%
2...........Pear............47%
3...........Banana..........44%
4...........Orange..........35%
5...........Watermelon......31%
如果我执行.order_by('title'),我将得到以下预期结果:

Rank        Title         Winrate      
1...........Apple...........55%
3...........Banana..........44%
4...........Orange..........35%
2...........Pear............47%
5...........Watermelon......31%
但如果我改为执行.filter(title_uicontains='an'),我会得到以下结果:

Rank        Title         Winrate      
1...........Banana..........44%
2...........Orange..........35%
而不是期望的:

Rank        Title         Winrate      
3...........Banana..........44%
4...........Orange..........35%
我对Django和python(以及数据库)还没有足够的经验,无法独自完成这项工作。我花了一段时间才弄明白如何注释排名,以及如何使用分页等

这是我的完整视图代码(如果相关)(我使用的是Django Rest框架和APIviews):

你可以使用图书馆

并遵循这一点

class GameDetailFilterView(APIView, PaginationHandlerMixin):
    permission_classes = (AllowAny, )
    pagination_class = FullPagination
    serializer_class = ChoiceSerializer

    def get(self, request, pk, *args, **kwargs):
        choices_filter = Choice.objects.filter(tournament=pk).annotate \
            (rank=RawSQL("RANK() OVER(ORDER BY winrate DESC, pickrate DESC, times_played)", []))
        filter_condition = request.session['filter_condition']
        if filter_condition is not None:
            choices = choices_filter.filter(title__icontains=filter_condition)
        else:
            choices = choices_filter.order_by('rank')

        page = self.paginate_queryset(choices)

        if page is not None:
            serializer = self.get_paginated_response(self.serializer_class(page,
                                                                           many=True).data)
        else:
            serializer = self.serializer_class(choices, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
from django_cte import CTEManager, With

# models.py
class Choice(Model):
    objects = CTEManager()
    # ... other fields like tournament

# query 
cte = With(
Choice.objects.filter(tournament=pk).annotate \
(rank=RawSQL("RANK() OVER(ORDER BY winrate DESC, pickrate DESC,times_played)", [])))
qs = cte.queryset().with_cte(cte).filter(title__icontains='an')