[英]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.