使用Paginator时,Django查询集是否真的很懒惰?

时间:2015-09-08 17:25:19

标签: python django

我用分页和多个查询集编写了一个视图。 但是,当我在实际使用分页之前使用namedtupled,sorted()和chain()方法时,我问自己我的查询是否可以解释为之前我实际使用的是Paginator。

在这种情况下,我的代码将是虚拟的:分页似乎按预期工作,但表现会很糟糕。 (因为我有一台功能强大的计算机和很少的数据,所以我现在无法检查它。)

在这种情况下,如果一切正常并且在分页发生之前查询,你能告诉我吗?

scan_evts = [ScanEventTuple(
    evt_id=e.pk,
    date=e.created) \
    for e in ScanEvent.get_scan_events(shop=shop_to_check) \
             .order_by('-created')]

userewards_evts = [UseRewardEventTuple(
    evt_id=e.pk,
    date=e.created) \
    for e in UseRewardEvent.get_usereward_events(shop=shop_to_check) \
             .order_by('-created')]

redeemdeals_evts = [RedeemDealsEventTuple(
    dr_id=e.pk,
    date=e.redeem_date) \
    for e in DealRecipients.get_redeem_events(shop=shop_to_check) \
             .order_by('-redeem_date')]

event_list = sorted(
    chain(scan_evts, userewards_evts, redeemdeals_evts),
    key=attrgetter('date'),
    reverse=True)

# Pagination
paginator = Paginator(event_list, 20)
page = request.GET.get('page')
try:
    all_events = paginator.page(page)
except PageNotAnInteger: # Mauvaise parametre
    all_events = paginator.page(1)
except EmptyPage: # Page out of range
    all_events = paginator.page(paginator.num_pages)

1 个答案:

答案 0 :(得分:3)

您的查询集未在此处进行延迟评估。只要迭代它们(例如在for e in ScanEvent.get...中),就会评估完整的查询集。参见:

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#when-querysets-are-evaluated

我不认为你能够在不评估它们的情况下对三个不同的查询集进行分页。