根据条件合并2个查询集

时间:2012-07-21 10:46:15

标签: python django-queryset

背景: - 我正在尝试合并来自同一模型的2个查询集。 像这样的东西。即每三个柜台应该合并。

queryset = get_foo(person)  #First queryset
promoted_foo = get_promoted_foo()  #Second queryset
for (counter,(s,p)) in enumerate(itertools.izip(queryset,promoted_foo)):
    if counter%3==0:
        queryset.insert(counter,promoted_foo.pop())
if promoted_foo:
   queryset.extend(promoted_foo)

最恐怖的方式是什么? 我知道我可以在quersets上使用list()然后合并它们。但这会占用大量内存。那么什么可以替代呢?

2 个答案:

答案 0 :(得分:1)

您可以定义自己的生成器,懒惰地从查询集中加载项目。

我没有测试过这个,但是有点像:

def everythird():
    queryset = get_foo(person)  #First queryset
    promoted_foo = get_promoted_foo()  #Second queryset
    for (counter,(s,p)) in enumerate(itertools.izip(queryset,promoted_foo)):
    if counter%3==0 and promoted_foo:
        yield promoted_foo
    elif queryset:
        yield queryset

答案 1 :(得分:1)

如果您不打算使用返回的值,则无需迭代queryset或promote_foo。您也不应该修改从循环中迭代的容器。

另一种方法是:

# For a range with step size 3, from 0 until the length of the shortest container.
for idx in xrange(0, min(len(queryset), len(promoted_foo), 3):
   queryset.insert(idx, promoted_foo.pop())
if promoted_foo:
    queryset.extend(promoted_foo)

PS。您在queryset上使用insert()意味着它已经是一个列表。

相关问题