Django QuerySet
ma dwie metody annotate
i aggregate
. Dokumentacja mówi, że:
W przeciwieństwie do agregacji (), annotate () nie jest klauzulą końcową. Dane wyjściowe klauzuli annotate () to QuerySet.
Czy jest między nimi jakaś inna różnica? Jeśli nie, to dlaczego aggregate
istnieje?
django
django-queryset
Alexander Artemenko
źródło
źródło
.annotate()
na samym qs nie trafia do db, ale wywołanieq[0].num_authors
tak? Zakładam, żeaggregate
zawsze musi trafić do bazy danych, ponieważ jest to klauzula terminala?connection.queries
. Wskazówka: sprawdź, czy tobook = q[0]
lub `book.num_authors` powoduje zapytanie.To główna różnica, ale agregaty działają również na większą skalę niż adnotacje. Adnotacje są nieodłącznie powiązane z pojedynczymi elementami w zestawie zapytań. Jeśli uruchomisz
Count
adnotację na czymś takim jak pole wiele do wielu, otrzymasz oddzielną liczbę dla każdego elementu członkowskiego zestawu zapytań (jako dodatkowy atrybut). Gdybyś jednak zrobił to samo z agregacją, spróbowałaby policzyć każdą relację na każdym elemencie zestawu zapytań, nawet duplikatów, i zwrócić ją jako jedną wartość.źródło
.annotate()
na samym qs nie trafia do db, ale wywołuje wynik adnotacji, takiej jakq[0].num_authors
robi? Zakładam, żeaggregate
zawsze musi trafić do bazy danych, ponieważ jest to klauzula terminala?Aggregate Aggregate generuje wartości wyników (podsumowania) w całym QuerySet. Agregacja działa na zestawie wierszy, aby uzyskać pojedynczą wartość z zestawu wierszy (na przykład suma wszystkich cen w zestawie wierszy). Agregat jest stosowany do całego zestawu QuerySet i generuje wartości wyniku (podsumowania) w całym zestawie QuerySet.
W modelu:
W skorupkach:
Annotate Annotate generuje niezależne podsumowanie dla każdego obiektu w QuerySet (możemy powiedzieć, że iteruje każdy obiekt w QuerySet i stosuje operację)
W modelu:
Z uwagi:
W związku z tym policzy polubienia każdego filmu
źródło
distinct=True
jest to wymagane w ostatnim przykładzie?