【问题标题】:Django ORM many to many filter by authors and the count of booksDjango ORM 多对多按作者和书籍数量过滤
【发布时间】:2020-12-13 21:22:11
【问题描述】:

我正在使用 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']

如何获取每位作者拥有的书籍数量?

【问题讨论】:

    标签: django django-models many-to-many django-orm


    【解决方案1】:

    一种方法是使用:

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

    这将返回一个按Author 的名字分组的查询集。在此查询集的结果中,您还可以根据每个 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'))
    

    【讨论】:

    • 谢谢罗汉。如果一本书有两个作者怎么办。这本书对两位作者都算吗?
    • 不客气,答案是肯定的,即使一本书的作者不止一个,它也会按每个用户计算。
    • 如果没有'book'列作者表,我们如何使用Count('book')
    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 2011-12-10
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2014-04-04
    相关资源
    最近更新 更多