Фильтрация связанных полей в функции annotate () в django - PullRequest
3 голосов
/ 10 октября 2010

В документации Django приведены примеры для использования annotate () для получения агрегированных результатов на основе связанных полей QuerySet (т. Е. С использованием соединений в annotate ()).

Упрощенный пример из документации, например, Store.objects.annotate(min_price=Min('books__price')), где books - это поле ManyToMany Store to Book, а price - это поле Book.

Чтобы продолжить этот пример, как мне сгенерировать аннотированные объекты QuerySet of Store с самыми низкими ценами не для всех книг в магазине, а только для книг с "author = 'William Shakespeare'"? Другими словами, как мне отфильтровать связанные поля, используемые для расчета агрегата?

1 Ответ

2 голосов
/ 10 октября 2010

Документация объясняет, как это сделать:

Store.objects.filter(books__author='William Shakespeare').annotate(
                     min_price=Min('books__price'))

Как указывает эта ссылка, здесь важен порядок фильтра и аннотации - потому что вы хотите считать только книги, которые соответствуютФильтр в аннотации, фильтр должен стоять первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...