web-dev-qa-db-fra.com

Comment puis-je trouver l'union de deux ensembles de requêtes Django?

J'ai un modèle Django avec deux méthodes de gestion personnalisées. Chacune renvoie un sous-ensemble différent des objets du modèle, basé sur une propriété différente de l'objet.

Existe-t-il un moyen d'obtenir un ensemble de requêtes, ou simplement une liste d'objets, qui est l'union des ensembles de requêtes retournés par chaque méthode de gestionnaire?

74
Paul D. Waite

Cela fonctionne et semble un peu plus propre:

records = query1 | query2

Si vous ne voulez pas de doublons, vous devrez ajouter .distinct():

records = (query1 | query2).distinct()
159
Jordan Reiter

À partir de version 1.11 , Django ont une méthode d'union intégrée.

q = q1.union(q2) #q will contain all unique records of q1 + q2
q = q1.union(q2, all=True) #q will contain all records of q1 + q2 including duplicates
q = q1.union(q2,q3) # more than 2 queryset union

Voir mon article de blog à ce sujet pour plus d'exemples.

40
Jose Cherian

Je suggérerais d'utiliser 'query1.union (query2)' au lieu de 'query1 | query2 '; J'ai obtenu des résultats différents des deux méthodes ci-dessus et la première est ce que j'attendais. Voici ce que j'avais rencontré:

enter image description here

enter image description here

0
Xianxing