【问题标题】:Django pagination does not match input QueryDjango分页与输入查询不匹配
【发布时间】:2020-03-03 10:02:08
【问题描述】:

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

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'),分页器的行为与预期相同。

【问题讨论】:

    标签: python django pagination django-pagination


    【解决方案1】:

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

    【讨论】:

    • 如果是排序问题,运行这段代码 100 次最终会给我True,但事实并非如此。这里的问题是切片的总和确定性地缺少一些行。
    • 你能只提取丢失的记录吗?有没有图案
    猜你喜欢
    • 2019-06-25
    • 2013-09-22
    • 2011-08-19
    • 2023-03-21
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多