2016-01-29 2 views
0

Я хочу выполнить операцию фильтрации на моем запросе вида (x = True) или ((x = False) и (какое-то другое условие)). Когда я попробую выполнить следующую команду, я получаю сообщение об ошибке. Какие-либо предложения.Django queryset с объектом Q

Операция

Item.objects.filter(mission_id__in=mission_ids).exclude(id__in=attempted_items).filter(
      answers_left_count__gte=1, is_active=True, is_test_data=False 
    ).values_list("mission_id", 'mission__items_per_mission', 'mission__send_remaining_items').annotate(
      Count('id') # Get item count 
    ).filter(Q(mission__send_remaining_items=True) | (
    Q(mission__send_remaining_items=False), Q(id__count__gte=F('mission__items_per_mission') + 1))).values_list(
      "mission_id", flat=True) 

Ошибка

TypeError: (<Q: (AND: ('mission__send_remaining_items__is', False))>, <Q: (AND: ('id__count__gte', <CombinedExpression: F(mission__items_per_mission) + Value(1)>))>) 
+0

Что такое кортеж Q's должен достичь? – dhke

+0

@dhke Я обновил свой вопрос – Simar

+0

, если вы поделитесь своей моделью и выходом, который хотите увидеть, будет полезно получить точный ответ. – FatmaT

ответ

1

Я хочу, чтобы выполнить работу фильтра на моем QuerySet вида (х = True) или ((х = False) и (некоторые другое состояние))

AND только , для Q объекты, когда непосредственно передается filter(), т.е.

.filter(Q(), Q()) 

Но это из-за того, как filter() обрабатывает свои аргументы, а не результат объединения двух Q объектов.

Q объекты объединения стало сделано через &:

.filter(Q() & Q()) 

Так что ваш запрос становится

.filter(Q() | (Q() & Q())) 
+0

Спасибо большое. – Simar

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