Database Django:分页ListView数据库性能

Database Django:分页ListView数据库性能,database,django,django-generic-views,django-pagination,Database,Django,Django Generic Views,Django Pagination,我有一个带有分页的列表视图: class StoriesListView(ListView): model = Story paginate_by = 20 def get_queryset(self): return Story.objects.all().order_by('-updated_at') 我在数据库中有1000个Story对象。当用户加载我的视图时会发生什么?将从数据库中查询所有1000个,还是仅查询20个?我如何优化它?它将只获得2

我有一个带有分页的
列表视图

class StoriesListView(ListView):
    model = Story
    paginate_by = 20

    def get_queryset(self):
        return Story.objects.all().order_by('-updated_at')

我在数据库中有1000个
Story
对象。当用户加载我的视图时会发生什么?将从数据库中查询所有1000个,还是仅查询20个?我如何优化它?

它将只获得20个对象。Paginator将
get_queryset
方法的结果作为起始queryset,并且它只会在迭代时命中数据库,所以很好
get\u queryset
方法不会影响数据库本身。

这取决于您如何使用它。QuerySet对象是,在这种特殊情况下,sql查询将添加
LIMIT
OFFSET
,因此查询始终只返回20个结果。但是,当您希望在模板中使用例如相关对象时,必须使用
select\u related
prefetch\u related
方法优化查询

我认为您应该阅读如何在django框架中使用


希望这有帮助。

分页器类获取
get\u queryset
的返回值(即本例中的整个queryset),并将其拼接,使您只能访问20个。它需要对整个queryset进行操作,否则您将无法使用它来显示页面列表

您可以查看以下代码以查看其实际操作:

>>>

这意味着,
queryset
变量是整个queryset。
page
变量仅用于获取属于当前页面的对象。这是通过评估它并点击DB来完成的。您可以在该页中的对象上迭代:
{%for page%}
中的对象,这样就不会再次命中数据库:

# https://github.com/django/django/blob/master/django/core/paginator.py#L119
def __getitem__(self, index):
    if not isinstance(index, (slice,) + six.integer_types):
        raise TypeError
    # The object_list is converted to a list so that if it was a QuerySet
    # it won't be a database hit per __getitem__.
    if not isinstance(self.object_list, list):
        self.object_list = list(self.object_list)
    return self.object_list[index]

我在分页过程中遇到了相同的问题。 对于分页,您不需要在model中生成函数

你可以使用LIMT,就像我的推广函数一样

def测试分页(请求):

广义分页函数
def分页数据(modalName,pageNo,每页):
数据={}#初始化变量
Modal=getModel(modalName)#获取模态引用的函数
count=Modal.objects.count()#计算记录数
每页无记录=ceil(浮动(计数)/每页
打印”,记录计数:“+str(每页无记录)
页数=[]#页数
附页(1)
a=1
而a<(每页无记录):
a+=1#与a=a+1相同
附页(a)
数据[“分页”]=页面#页面显示链接的分页
数据[“页码”]=页码
data['data']=Modal.objects.all()[(pageNo-1)*每页):(pageNo*每页)]
数据['dataIndex']=str((页码-1)*每页)
返回数据
dataObj             = paginationData('Item',page_no,10)
data["dataIndex"]   = dataObj["dataIndex"]
data["page_no"]     = dataObj["page_no"] #given page number will helps to active link at template
data["data"]        = dataObj["data"]  #actual data will helps in template
data['pagination']  = dataObj["pagination"] #Will helps to make dynamic link for pagination
def paginationData(modalName,pageNo,perPage):
    data = {} #initialize variables
    Modal = getModel(modalName) # Function to get modal reference
    count = Modal.objects.count()#Calculate no of records
    no_of_record_per_page = ceil(float(count) / perPage)
    print ",Records counts : " + str(no_of_record_per_page)
    pages = [] #No of pages
    pages.append(1) 
    a = 1
    while a < (no_of_record_per_page):
        a += 1 # Same as a = a + 1
        pages.append(a)
    data["pagination"] = pages # pagenation for display link of page
    data["page_no"] = pageNo
    data['data'] = Modal.objects.all()[((pageNo-1)*perPage):(pageNo*perPage)]
    data['dataIndex'] = str((pageNo -1)*perPage) 
    return data