有一个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)
);
由于循环将通过members
,它将首先获得specificMember
,然后使用原始db.Members
使用的任何延迟加载逻辑。
在Django和Python中有没有同样的方法?
使用itertools.chain
。类似于:
import itertools
original_members = .... # get an iterator of the data
members = itertools.chain([specific_member], original_members)
chain函数返回一个迭代器。迭代器首先返回第一个参数中序列的值,该参数是包含specific_member的单个元素列表。然后它开始返回original_members
的值,我认为这是一个惰性序列。