Django - Нужна помощь в написании аннотированного запроса

Я пытаюсь лучше понять, как писать более продвинутые запросы. Я привык к основным Model.objects.all() и .filter(), и т.д., но у меня возникают проблемы с написанием аннотированных запросов.

Вот моя настройка модели (я удалил все дополнительные поля, которые не нужны для этого вопроса):

from django.db import models

class Client(models.Model): 
    name = models.CharField(max_length=100)

class Project(models.Model): 
    client = models.ForeignKey(Client, on_delete=models.CASCADE)

class Campaign(models.Model): 
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name="campaigns")

class Advertisement(models.Model): 
    campaign = models.ForeignKey(Campaign, on_delete=models.CASCADE, related_name='advertisements')

Мне нужен запрос, который показывает, сколько реклам у каждого клиента, в порядке от наибольшего к наименьшему.

Я пытаюсь следовать документации отсюда: https://docs.djangoproject.com/en/4.0/topics/db/aggregation/ но их пример аннотации не такой вложенный, пример модели издателя - внешний ключ на объекте книги, в то время как у меня клиент - внешний ключ проекта, который является внешним ключом кампании, которая является внешним ключом рекламы.

Посоветуйте, как пройти через слои моделей, чтобы получить нужную мне информацию?

В Django ORM соединения, которые перемещаются по отношениям, выполняются с помощью __. Вы можете продолжать вложение обхода отношений. В результате ваш запрос будет выглядеть следующим образом.

Client.objects.annotate(num_advertisements=Count('project__campaigns__advertisements'))

Имена campaigns и advertisements должны использоваться из-за установленных вами related_name.

Вернуться на верх