Группировать объекты Django по значению поля внешнего ключа

#django #rest #django-rest-framework

#django #rest #django-rest-framework

Вопрос:

 class Publisher(models.Model):
    name = CICharField("Name", max_length=200, unique=True)
    description = models.TextField("Description", blank=True)

class Category(models.Model):
    name = CICharField("Name", max_length=200, unique=True)
    description = models.TextField("Description", blank=True)

class Book(models.Model):
    name = CICharField("Name", max_length=200, unique=True)
    description = models.TextField("Description", blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="books", blank=True, null=True)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name="books", blank=True, null=True)

  

Я хочу, чтобы все объекты Books фильтровались по издателю и группировались по категориям. Например.

 books = Books.objects.all().filter(publisher=1).group_by('category')
  

Вывод будет выглядеть,

 [
{ category 1: [book1, book2, ...] },
{ category 2: [book3, book4,... ] },
 ]
  

Может кто-нибудь сказать мне, как я могу этого добиться?

Спасибо.

Ответ №1:

Я предполагаю, что вы хотите выполнить некоторую агрегацию своих данных (например, подсчет или сумма). Для этой цели вы можете использовать что-то вроде

 from django.db.models import Count

books = Books.objects.all().filter(publisher=1).values('category').annotate(Count('id'))
  

Который будет группировать ваши данные category и подсчитывать идентификаторы ваших книг на основе каждой группы. Вы также можете прочитать больше о аннотации здесь .