簡體   English   中英

根據條件合並2個查詢集

[英]Merge 2 queryset based on the on a condition

背景: - 我試圖合並來自同一模型的2個查詢集。 像這樣的東西。 即每個第3個櫃台應該合並。

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()然后合並它們。 但這會占用大量內存。 那有什么可以替代呢?

您可以定義自己的生成器,從延遲加載查詢集中的項目。

我沒有測試過這個但是類似的東西:

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

如果您不打算使用返回的值,則無需迭代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()意味着它已經是一個列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM