Django ORM фильтр «многие ко многим» по авторам и количеству книг

#django #django-models #many-to-many #django-orm

#django #django-модели #многие ко многим #django-orm

Вопрос:

Я использую Django 2.2

У меня есть две таблицы с отношением «Многие ко многим»

 class Book(models.Model):
    title = models.CharField(max_length=50)
    authors = models.ManyToManyField(Author)

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
  

У меня есть список авторов first_name

 author_names = ['john', 'parker', 'donald']
  

Как я могу получить количество книг, которые есть у каждого автора?

Ответ №1:

Один из способов — использовать:

 from django.db.models import Count
Author.objects.values('first_name').annotate(count_books=Count('book'))
  

который вернет набор запросов, сгруппированный по Author имени. В результате этого набора запросов вы также можете увидеть количество книг на основе first_name каждого Author (например <QuerySet [{'first_name': 'john', 'count_books': 1}, {'first_name': 'parker', 'count_books': 3}]> ), и если вы хотите отфильтровать этот набор запросов, вы можете изменить его на:

 Author.objects.filter(first_name__in=author_names).values('first_name').annotate(count_books=Count('book'))
  

Однако, если вы хотите посмотреть, сколько книг связано с каждым Author объектом, вы можете сделать что-то вроде:

 from django.db.models import Count
Author.objects.values('id').annotate(count_books=Count('book'))
  

Комментарии:

1. Спасибо, Рохан. Что, если у одной книги два автора. Будет ли эта книга учитываться для обоих авторов?

2. Пожалуйста, и ответ «да», он будет считать это для каждого пользователя, даже если у книги более одного автора.

3. как мы можем использовать Count(‘book’), если в таблице авторов столбца ‘book’ нет