J'ai un modèle Django avec deux méthodes de gestion personnalisées. Chacun 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, c'est l'union des ensembles de requêtes retournés par chaque méthode de gestionnaire?
python
django
django-models
Paul D. Waite
la source
la source
Réponses:
Cela fonctionne et semble un peu plus propre:
Si vous ne voulez pas de doublons, vous devrez ajouter
.distinct()
:la source
ManyToManyField
s. Par exemple, vous verrez parfois querecords.count()
sera supérieur àquery1.count() + query2.count()
, ce qui est clairement incorrect.QuerySet
classe fournit des méthodes pour__and__
et__or__
qui sont appelées lorsque les opérateurs&
ou|
sont utilisés entre deuxQuerySet
objets (également utilisés pour laQ
classe ).À partir de la version 1.11 , les ensembles de requêtes 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.
la source
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 à quoi je m'attendais. Voici ce que j'avais rencontré:
print "union result:" for element in query_set1.union(query_set2): print element print "| result:" for element in (query_set1 | query_set2): print element
résultat:
la source