1
0
mirror of https://github.com/django/django.git synced 2024-12-23 01:25:58 +00:00

Added documentation about different results according to order of annotate() and filter() in a query.

This commit is contained in:
SirAbhi13 2022-11-08 23:45:45 +05:30
parent 9da2210f12
commit e108cb4a57

View File

@ -425,6 +425,27 @@ publisher's that have at least one book with a rating exceeding 3.0. The second
query asks for the average of a publisher's book's ratings for only those
ratings exceeding 3.0.
Using multivalued filtering against a previously annotated aggregation might
still yield duplicate results.
Given:
* Publisher A has two books with each having 100 pages.
Here's an example demonstrating this behavior::
>>> a = Publisher.objects.annotate(total_pages(Sum("books__pages"))
>>> a.total_pages
200
>>> b = Publisher.objects.annotate(Sum("books__pages")).filter(books__in=Books.objects.all())
>>> b.total_pages
400
This is behavior is caused because ``filter()`` calls won't reuse multivalued
JOINS generated by previous ``annotate()`` or ``filter`` calls. To prevent issues,
you should filter after annotations (not the other way around) or use
``Aggregate.filter``.
It's difficult to intuit how the ORM will translate complex querysets into SQL
queries so when in doubt, inspect the SQL with ``str(queryset.query)`` and
write plenty of tests.