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']

如何获取每个作者拥有的图书数量

解决方法

一种方法是使用:

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

,它将返回按Author的名字分组的查询集。在此查询集的结果中,您还可以查看基于每个Author的first_name(例如<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'))