O Django QuerySet
tem dois métodos, annotate
e aggregate
. A documentação diz que:
Ao contrário de aggregate (), annotate () não é uma cláusula terminal. A saída da cláusula annotate () é um QuerySet.
Existe alguma outra diferença entre eles? Se não, por que aggregate
existe?
django
django-queryset
Alexander Artemenko
fonte
fonte
.annotate()
em um qs sozinho não atinge o db, mas chamarq[0].num_authors
sim? Presumo queaggregate
deve sempre acertar o db, pois é uma cláusula terminal?connection.queries
. Dica: verifique se é obook = q[0]
ou `book.num_authors` que causa a consulta.Essa é a principal diferença, mas os agregados também funcionam em uma escala maior do que as anotações. As anotações são inerentemente relacionadas a itens individuais em um queryset. Se você executar uma
Count
anotação em algo como um campo muitos-para-muitos, você obterá uma contagem separada para cada membro do queryset (como um atributo adicionado). Se você fizesse o mesmo com uma agregação, entretanto, ela tentaria contar todos os relacionamentos em cada membro do queryset, até mesmo duplicatas, e retornaria isso como apenas um valor.fonte
.annotate()
em um qs sozinho não atinge o db, mas chama o resultado de uma anotação como oq[0].num_authors
faz? Presumo queaggregate
deve sempre acertar o db, pois é uma cláusula terminal?Agregado Agregado gera valores de resultado (resumo) sobre um QuerySet inteiro. Aggregate operar sobre o conjunto de linhas para obter um único valor do conjunto de linhas. (Por exemplo, soma de todos os preços no conjunto de linhas). O agregado é aplicado em todo o QuerySet e gera valores de resultado (resumo) em todo o QuerySet.
No modelo:
Em Shell:
Annotate Annotate gera um resumo independente para cada objeto em um QuerySet. (Podemos dizer que itera cada objeto em um QuerySet e aplica a operação)
No modelo:
Em vista:
Em vista irá contar os gostos para cada vídeo
fonte
distinct=True
é necessário no último exemplo?