有没有办法在Python中构建延迟序列?

Dan*_*mov 2 python django generator-expression django-queryset lazy-sequences

有一个Django视图,Member使用某个过滤器从数据库加载对象.

现在我需要改变这个逻辑以呈现一个特定的Member第一个,并让其余的按照它们的自然顺序.

最直接的方法是立即执行查询,获取列表,删除并在开头插入项目.但是,如果仍然有任何方法可以利用QuerySet懒惰的本性,我最好奇.

在C#中,我会写:

IEnumerable<Member> members = db.Members; // db.Members is lazy
members = Enumerable.Union( // construct a lazy sequence that traverses its arguments
    new [] { specificMember },
    members.Where(m => m != specificMember)
);
Run Code Online (Sandbox Code Playgroud)

当循环通过时members,它将首先获得specificMember然后使用任何延迟加载逻辑原始db.Members使用.

有没有办法在Django和Python中做同样的事情?

Mar*_*ans 6

使用itertools.chain.就像是:

import itertools
original_members = .... # get an iterator of the data
members = itertools.chain([specific_member], original_members)
Run Code Online (Sandbox Code Playgroud)

chain函数返回一个迭代器.迭代器首先返回第一个参数中序列的值,该参数是包含specific_member的单元素列表.然后它开始返回值original_members,我假设这是一个懒惰的序列.