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

时间:2011-06-15 22:21:35

标签: python django django-queryset lazy-sequences generator-expression

有一个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中做同样的事情?

1 个答案:

答案 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返回值,我假设这是一个懒惰的序列。