2014-05-19 3 views
3

Я должен объединить querysets ниже в одном списке:Как объединить несколько наборов запросов в Джанго

result_list_1 = Col.objects.defer("tags").filter(producer__username__icontains=crit) 
result_list_2 = Col.objects.defer("tags").filter(name__icontains=crit) 
result_list_3 = Col.objects.defer("tags").filter(description__icontains=crit) 
result_list_4 = Col.objects.filter(tags__name__icontains=crit) 
... 

Каждый result_list содержит элементы, которые имеют уникальный числовой идентификатор я могу использовать, чтобы убедиться, что нет ни одного Dups.

Я не могу использовать | при запросе объектов БД или Q.

Как объединить Resulsets в одном списке?

+0

посмотреть здесь: http://escrow.aliexpress.com : //stackoverflow.com/questions/431628/how-to-combine-2-or-more-querysets-in-a-django-view – Alex

+0

Спасибо, Алекс, я видел это. В комментарии о слиянии элементов без дубликатов есть ссылка, но это не очень понятно. – Miki

+0

Спасибо Steinar, нет объектов Q. – Miki

ответ

2

Тогда у вас не может быть QuerySet, и это функциональность, связанная с django, но вы можете использовать itertools.chain, который специально предназначен для объединения нескольких итераций.

import itertools 

merged = itertools.chain(qs1, qs2, qs3, qs4) 

for element in merged: 
    print(element) 
4

насчет небольшой модификации itertools.chain, что гарантирует, что вы не получите обмануты:

def unique_chain(*iterables): 
    known_ids = set() 
    for it in iterables: 
     for element in it: 
      if element.id not in known_ids: 
       known_ids.add(element.id) 
       yield element 

С, что вы можете создать объединенный список:

combined_list = list(unique_chain(result_list_1, result_list_2, ...)) 
+1

Спасибо Steffens. Это сделал трюк. Я подозреваю, что могут быть более эффективные методы, но это работает. – Miki

Смежные вопросы