Как рассчитать общее вхождение отдельного поля той же модели в Django? - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь получить общее количество вхождений поля в той же модели в django. Можно ли это сделать или нет?

например, у меня есть модель, как показано ниже:

class Blog(DateTimeModel):
    title = models.CharField(max_length=255)
    description = models.TextField()
    category = models.CharField(max_length=255, null=True, blank=True)

и таблица данных, как показано ниже:

 id | title                               | description          | category
----+-------------------------------------+----------------------+----------
  1 | blog title first                    | description 1        | social
  2 | blog title second                   | description 2        | social
  3 | blog title third                    | description 3        | community
  4 | blog title fourth                   | description 4        | community
  5 | blog title fifth                    | description 5        | people

Я хочу, чтобы результат был:

<QuerySet [{'category': 'social', 'blog_count': '2'}, {'category': 'community', 'blog_count': '2'}, {'category': 'people', 'blog_count': '1'}]>

Я попытался сделать Blog.objects.values('category').order_by('category').distinct('category').count() и получил результат как 3, который является истинным, потому что он подсчитал общее количество различных значений, связанных с категорией.

Счетчик аннотации Django с отдельным полем В этом посте представлено решение, в котором мы можем подсчитывать поля на основе двух моделей. Но я хочу получить результаты от той же модели.

1 Ответ

2 голосов
/ 10 июля 2019

Вы можете получить такой набор запросов с помощью:

from django.db.models import <b>Count</b>

Blog.objects.values('category').annotate(
    <b>blog_count=Count('pk')</b>
).order_by('category')

При этом моделирование может быть неоптимальным, поскольку оно создает большое количество дублирования данных . Представьте, что если позже вы захотите переименовать category, это приведет к огромному количеству работы, поскольку эти категории могут быть распределены по множеству таблиц.

Имеет смысл реализовать модель Category, например:

class Category(models.Model):
    name = models.CharField(max_length=255, unique=True)

class Blog(DateTimeModel):
    title = models.CharField(max_length=255)
    description = models.TextField()
    category = models.ForeignKey(<b>Category</b>, null=True)

Затем вы можете аннотировать Category объекты, например:

from django.db.models import <b>Count</b>

<b>Category</b>.objects.annotate(
    <b>blog_count=Count('blog')</b>
)
...