在Django中不使用查询集对数据进行分页?

stszievb  于 2023-05-19  发布在  Go
关注(0)|答案(2)|浏览(102)

Django Pagination object使用QuerySet查询数据库。
我可以生成一些信息,但不是直接来自数据库。相反,它是派生的。
是否有一个对象可以帮助我对它进行分页,或者我应该重新实现自己的分页?
在这个sort-of related question中,他们只是制作了自己的分页器。

zi8p0yeb

zi8p0yeb1#

糟糕,Paginator处理非QuerySet对象。the docs
注意,你可以给予Paginator一个list/tuple,一个Django QuerySet,或者任何其他带有count()或__len__()方法的对象。当确定传递的对象中包含的对象数量时,Paginator将首先尝试调用count(),然后如果传递的对象没有count()方法,则回退到使用len()。这允许像Django的QuerySet这样的对象在可用时使用更有效的count()方法。

1l5u6lss

1l5u6lss2#

是否有一个对象可以帮助我对它进行分页,或者我应该重新实现自己的分页?
对象不一定是QuerySet,它应该是一个接受使用.count()len(…)获取元素数量并对其进行切片的对象,因此…[lo:hi]。例如,列表也可以通过这种方式进行分页。
当然,使用列表通常会破坏分页的目的:你通常希望阻止将所有元素加载到内存中,因为这会耗尽内存,或者这样做会在计算上消耗大量资源。
但是你可以相应地创建一个实现__len____getitem__方法的类,所以:

class Paginatable:
    def __init__(self, lo=None, hi=None):
        self.lo = lo
        self.hi = hi

    def __len__(self):
        return 42  # the number of real elements

    def __getitem__(self, slicer):
        if not isinstance(slicer, slice):
            raise TypeError('should only slice')
        else:
            lo = slicer.start if self.lo is None else slicerstart + self.lo
            hi = (
                slicer.stop - slicer.start + lo
                if self.hi is None
                else min(slicer.stop - slicer.start + lo, self.hi)
            )
            return Paginatable(lo=lo, hi=hi)

然后,Paginatable可以例如处理文件、执行机器学习任务等。以确定项目的子集。

相关问题