2010-06-14 3 views
0

Я искал способ объединения запросов в django. Из того, что я читал, вы можете использовать query1 | query2, чтобы принять объединение ... Это, похоже, не работает при использовании значений(). Я бы пропустил использование значений до тех пор, пока не получив объединение, но мне нужно использовать аннотацию, чтобы взять сумму поля и фильтровать его, а так как нет возможности делать «group by», мне нужно использовать значения(). Другие предложения, которые я прочитал, должны были использовать объекты Q, но я не могу думать о том, как это работает.Union on ValuesQuerySet in django

Нужно ли мне просто использовать прямой SQL или есть способ django сделать это?

Что я хочу:

q1 = mymodel.objects.filter(date__lt = '2010-06-11').values('field1','field2').annotate(volsum=Sum('volume')).exclude(volsum=0) 
q2 = mymodel.objects.values('field1','field2').annotate(volsum=Sum('volume')).exclude(volsum=0) 
query = q1|q2 

Но это не работает, и насколько я знаю, что нужно «ценности» отчасти потому, что нет другого пути для Sum, чтобы знать, как действовать, так как это 15 столбцов.

ответ

2

QuerySet.values() не возвращает QuerySet, а скорее ValuesQuerySet, который не поддерживает эту операцию. Преобразуйте их в list и затем добавьте их.

query = list(q1) + list(q2) 
+0

Это немного отличается от объединения ... Если на q1 и q2 имеется перекрытие, я бы получил дубликаты записей в запросе. Я попробовал set (q1) | set (q2), но словари изначально хешируются. – Wuxab

+0

Существует довольно много методов для получения правильного объединения двух списков в Python здесь, даже с нераскрывающимися типами. Или в худшем случае вы можете использовать преобразование Шварца и поместить их все в диктовку. http://en.wikipedia.org/wiki/Schwartzian_transform –