Аннотация Всего созданных, измененных и удаленных за каждый год

С учетом модели Item как мне найти общее количество элементов, созданных, измененных и удаленных за каждый год? И можно ли это сделать одним запросом к базе данных?

from django.db import models

class Item(models.Model):
    created_at = models.DateTimeField(null=True, blank=True)
    modified_at = models.DateTimeField(null=True, blank=True)
    deleted_at = models.DateTimeField(null=True, blank=True)

Мой текущий запрос возвращает одинаковые значения для total_created, total_modified и total_deleted.

from django.db.models.functions import TruncYear

Item.objects.annotate(
    created_at_year=TruncYear("created_at"),
    modified_at_year=TruncYear("modified_at"),
    deleted_at_year=TruncYear("deleted_at"),
).values("created_at_year", "modified_at_year", "deleted_at_year").annotate(
    total_created=models.Count("id"),
    total_modified=models.Count("id"),
    total_deleted=models.Count("id"),
)

Пример данных | id | created_at | modified_at | deleted_at | |----|---------------------|---------------------|---------------------| | 1 | 2020-01-01 01:01:01 | 2020-01-01 01:01:01 | 2021-01-01 01:01:01 | | 2 | 2020-01-01 01:01:01 | 2021-01-01 01:01:01 | 2021-01-01 01:01:01 | | 3 | 2020-01-01 01:01:01 | 2021-01-01 01:01:01 | 2022-01-01 01:01:01 |

Желаемый выход

{
    "2020": {"total_created": 3, "total_modified": 1, "total_deleted": 0},
    "2021": {"total_created": 0, "total_modified": 2, "total_deleted": 2},
    "2022": {"total_created": 0, "total_modified": 0, "total_deleted": 1},
}

Я знаю, что можно добавить параметр filter к Count, но я не знаю, могу ли я использовать это здесь.

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