Django分页与输入查询

时间:2019-11-06 20:51:49

标签: python django pagination django-pagination

我有一些看起来像这样的代码。

page_objects = Page.objects.exclude(lorem).filter(blah).annotate(key=bar).order_by(foo)
paginator = Paginator(page_objects, 50)

在我的UI上,我注意到使用bar的某些值,我在输出中缺少行。我跑了 比较分页器输出和查询输出的实验。

page_results = []
for page_number in paginator.page_range:
    result = paginator.page(page_number)
    page_results += result.object_list
paginator_ids = sorted([x.id for x in page_results])
page_object_ids = sorted(x.id for x in list(page_objects))
print(paginator_ids == page_object_ids) => FALSE
print(len(paginator_ids) == len(page_object_ids)) => TRUE

如您所见,查询中的对象列表和分页器中的所有对象列表不匹配。我目视检查了列表以确认这是正确的(两个列表中的ID明显不同)。

我在Django==1.11.3

这是怎么回事,为什么我的分页器的行为不像文档?

有趣的是,如果我将order_by更改为order_by(foo, 'id'),则分页器的行为符合预期。

1 个答案:

答案 0 :(得分:0)

分页器仅对查询的输出进行切片。与惰性查询结合的返回数据的顺序不必与整个查询相同。简而言之,分页器或查询集没有任何问题,您只是在比较以不同方式排序的两个列表(就像您通过添加id所注意到的那样)。