РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
138 of 818 menu

Класс Count

Класс Count применяется в агрегации и аннотации QuerySet для вычисления количества записей. Он принимает имя поля или выражение и возвращает количество объектов, удовлетворяющих условиям. При использовании с ForeignKey и ManyToManyField позволяет подсчитывать связанные объекты.

Параметры конструктора класса Count:

  • expression - имя поля или выражение для подсчета
  • distinct - булевый флаг, указывающий, учитывать ли только уникальные значения
  • filter - условие фильтрации для подсчитываемых объектов

Синтаксис

from django.db.models import Count Count(expression, distinct=False, filter=None)

Пример

Рассмотрим модель Article с полями title и author:

from django.db import models class Article(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=50) is_published = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.title

Подсчитаем общее количество статей в базе данных:

from myapp.models import Article from django.db.models import Count # Подсчет всех статей total_articles = Article.objects.aggregate(total=Count('id')) print(total_articles)

Результат выполнения кода:

{"total": 10}

Пример

Используем аннотацию для подсчета количества статей для каждого автора:

from myapp.models import Article from django.db.models import Count # Подсчет статей по авторам author_counts = (Article.objects .values('author') .annotate(article_count=Count('id')) .order_by('-article_count')) for item in author_counts: print(f"{item['author']}: {item['article_count']}")

Результат выполнения кода:

"John Doe: 5" "Jane Smith: 3" "Bob Johnson: 2"

Пример

Используем параметр distinct для подсчета уникальных значений поля author:

from myapp.models import Article from django.db.models import Count # Подсчет уникальных авторов distinct_authors = Article.objects.aggregate( unique_authors=Count('author', distinct=True)) print(distinct_authors)

Результат выполнения кода:

{"unique_authors": 3}

Пример

Используем параметр filter для подсчета только опубликованных статей каждого автора:

from myapp.models import Article from django.db.models import Count, Q # Подсчет опубликованных статей по авторам published_counts = (Article.objects .values('author') .annotate( published_count=Count('id', filter=Q(is_published=True))) .order_by('-published_count')) for item in published_counts: print(f"{item['author']}: {item['published_count']}")

Результат выполнения кода:

"John Doe: 4" "Jane Smith: 2" "Bob Johnson: 1"

Пример

Используем Count с ForeignKey для подсчета связанных объектов. Рассмотрим модель Author и связанные с ней статьи:

from django.db import models class Author(models.Model): name = models.CharField(max_length=50) def __str__(self): return self.name class Article(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='articles')

Подсчитаем количество статей для каждого автора с использованием аннотации:

from myapp.models import Author from django.db.models import Count # Подсчет статей для каждого автора authors_with_counts = (Author.objects .annotate(article_count=Count('articles')) .order_by('-article_count')) for author in authors_with_counts: print(f"{author.name}: {author.article_count}")

Результат выполнения кода:

"John Doe: 5" "Jane Smith: 3" "Bob Johnson: 2"

Смотрите также

  • класс Sum,
    который вычисляет сумму значений поля
  • класс Avg,
    который вычисляет среднее значение поля
  • метод annotate,
    который добавляет аннотации к каждому объекту QuerySet
  • метод aggregate,
    который вычисляет агрегатные значения для всего QuerySet
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить