From 28e5b665189548557993b522e3bd7adeed3f62ea Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Tue, 10 Apr 2012 20:05:46 +0000 Subject: Fixed #18087 -- Prevented date-based generic views from loading entire tables in memory when pagination is enabled. git-svn-id: http://code.djangoproject.com/svn/django/trunk@17893 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/views/generic/dates.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'django') diff --git a/django/views/generic/dates.py b/django/views/generic/dates.py index e5c3e5bbe3..e1daa9f04d 100644 --- a/django/views/generic/dates.py +++ b/django/views/generic/dates.py @@ -190,14 +190,19 @@ class BaseDateListView(MultipleObjectMixin, DateMixin, View): date_field = self.get_date_field() allow_future = self.get_allow_future() allow_empty = self.get_allow_empty() + paginate_by = self.get_paginate_by(qs) if not allow_future: qs = qs.filter(**{'%s__lte' % date_field: timezone.now()}) - if not allow_empty and not qs: - raise Http404(_(u"No %(verbose_name_plural)s available") % { - 'verbose_name_plural': force_unicode(qs.model._meta.verbose_name_plural) - }) + if not allow_empty: + # When pagination is enabled, it's better to do a cheap query + # than to load the unpaginated queryset in memory. + is_empty = not bool(qs) if paginate_by is None else not qs.exists() + if is_empty: + raise Http404(_(u"No %(verbose_name_plural)s available") % { + 'verbose_name_plural': force_unicode(qs.model._meta.verbose_name_plural) + }) return qs -- cgit v1.3