小记, django select 字段中含有连表查询 分页优化

小记, django select 字段中含有连表查询 分页优化,第1张

小记, django select 字段中含有连表查询 分页优化,第2张

  • 例如 查询每本书的借阅数量,在 select 中加入连表
select id,(select count(*) from book where book.user_id= user.id) as count,name from user;
  • 在 django 分页最后会变成

    select count(*) from (
    select id,(select count(*) from book where book.user_id= user.id) as count,name from user) 
    
  • 优化,在 restframework 中分页, 去掉 select 字段 ,只保留 filter 条件

    from rest_framework.pagination import PageNumberPagination
    from django.core.paginator import Paginator
    from django.utils.functional import cached_property
    
    class Pagination(Paginator):
    
        @cached_property
        def count(self):
            """Return the total number of objects, across all pages."""
            c = getattr(self.object_list, 'count', None)
            if callable(c) and not inspect.isbuiltin(c) and method_has_no_args(c):
                return self.object_list.values('id').count()
            return len(self.object_list)
    
    
    class CustomPagination(PageNumberPagination):
        django_paginator_class = TicketPagination
    
    
    
  • 接口中使用

    class API(ModelViewSet):
      pagination_class = CustomPagination
    
----------------------- 以下是精选回复-----------------------

答:LIMIT/OFFSET 性能太差了:查询耗时会随着页数增长。假如每页 10 条数据,要查询第 10 页的数据。数据库查询需要先跳过 90 条,再查询 10 条数据。

建议改用 CursorPagination

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 小记, django select 字段中含有连表查询 分页优化

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情