Eu tenho um modelo Django com dois métodos de gerenciamento personalizados. Cada um retorna um subconjunto diferente de objetos do modelo, com base em uma propriedade diferente do objeto.
Existe alguma maneira de obter um queryset, ou apenas uma lista de objetos, que é a união dos querysets retornados por cada método do gerenciador?
python
django
django-models
Paul D. Waite
fonte
fonte
Respostas:
Isso funciona e parece um pouco mais limpo:
Se você não quiser duplicatas, precisará acrescentar
.distinct()
:fonte
ManyToManyField
s. Por exemplo, às vezes você verá querecords.count()
será maior do quequery1.count() + query2.count()
, o que é claramente incorreto.QuerySet
classe fornece métodos para__and__
e__or__
que são chamados quando os operadores&
ou|
são usados entre doisQuerySet
objetos (também usados para aQ
classe também )A partir da versão 1.11 , django querysets tem um método de união embutido.
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
Veja minha postagem no blog sobre isso para mais exemplos.
fonte
Eu sugeriria usar 'query1.union (query2)' em vez de 'query1 | query2 '; Obtive resultados diferentes com os dois métodos acima e o anterior é o que eu esperava. O seguinte é o que eu descobri:
print "union result:" for element in query_set1.union(query_set2): print element print "| result:" for element in (query_set1 | query_set2): print element
resultado:
union result: KafkaTopic object KafkaTopic object KafkaTopic object KafkaTopic object KafkaTopic object | result: KafkaTopic object KafkaTopic object
fonte