2016-01-29 3 views
0

Je souhaite effectuer une opération de filtrage sur mon jeu de requête de la forme (x = True) ou ((x = False) et (autre condition)). Lorsque j'essaie la commande suivante, j'obtiens une erreur. Aucune suggestion.Queryset Django avec objet Q

Opération

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) 

Erreur

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

Quel est le tuple de Q's censé atteindre? – dhke

+0

@dhke J'ai mis à jour ma question – Simar

+0

si vous partagez votre modèle et la sortie que vous voulez voir, il sera utile d'obtenir une réponse précise. – FatmaT

Répondre

1

Je veux effectuer une opération de filtre sur mon queryset de la forme (x = True) ou ((x = False) et (certains autre condition))

AND est seulement , pour Q objets lorsqu'ils sont directement passés à filter(), à savoir

.filter(Q(), Q()) 

Mais c'est à cause de la façon dont filter() traite ses arguments, et non le résultat de la combinaison de deux Q objets.

objets se fait Q AND Les via &:

.filter(Q() & Q()) 

Ainsi, votre requête devient

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

Merci beaucoup mon pote. – Simar