Code

Opened 4 years ago

Closed 4 years ago

#13643 closed (duplicate)

Admin changelist page very slow with postgresql and a huge table

Reported by: marcob Owned by: nobody
Component: contrib.admin Version: 1.2
Severity: Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

Description

Postgresql count(*) is a slooow operation because it forces a full table scan.
It would be nice to have an admin option to disable full counts and only provide previous/next-based navigation.

As a workaround you could get this LazyPaginator http://github.com/andymckay/lazy_paginator and write a bit of (ugly) monkey patching:

# Lazy pagination
from lazypaginator import LazyPaginator, InvalidPage
from django.contrib.admin.views import main
_ChangeList = main.ChangeList
_get_results = main.ChangeList.get_results

class ChangeList(_ChangeList):
    def get_results(self, request):
        if not getattr(self.model_admin, 'lazy_pagination', False):
            return _get_results(self, request)

        paginator = LazyPaginator(self.query_set, self.list_per_page, max_safe_pages=5)
        full_result_count = result_count = paginator.max_safe_pages * self.list_per_page
        can_show_all = False
        multi_page = result_count > self.list_per_page

        # Get the list of objects to display on this page.
        try:
            result_list = paginator.page(self.page_num+1).object_list
        except InvalidPage:
            result_list = ()

        self.result_count = result_count
        self.full_result_count = full_result_count
        self.result_list = result_list
        self.can_show_all = can_show_all
        self.multi_page = multi_page
        self.paginator = paginator

setattr(main, 'ChangeList', ChangeList)

Then you could use in your model admin:

    lazy_pagination = True

Pro: no more changelist delay with huge table
Con: wrong record count

Ciao.
Marco.

Attachments (0)

Change History (1)

comment:1 Changed 4 years ago by anonymous

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Resolution set to duplicate
  • Status changed from new to closed

Dupe of #8408

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.