有一个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中做同样的事情?
答案 0 :(得分:6)
使用itertools.chain
。类似的东西:
import itertools
original_members = .... # get an iterator of the data
members = itertools.chain([specific_member], original_members)
chain函数返回一个迭代器。迭代器首先返回第一个参数中序列的值,该参数是包含specific_member的单元素列表。然后它开始从original_members
返回值,我假设这是一个懒惰的序列。