python - Django 中如何统计外键属性值

标签 python django django-models

给定的模型设置如下:

class Author(models.Model):
    name = models.CharField(max_length=255)

class Genre(models.Model):
    name = models.CharField(max_length=255)

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    genre = models.ForeignKey(Genre, on_delete=models.CASCADE)

如何计算每个作者所创作的流派数量?理想情况下,我想要一本包含每位作者的流派和书籍数量的字典。

[{id: author.id, genres: {genre.id: number_of_books}}]

这可以通过查询每种流派的作者轻松实现,但这将导致 [作者数量]*[流派数量] 查询。如果可能的话,我想找到一种更有效的方法。

最佳答案

我们可以查询 Book 对象,例如:

from django.db.models import Count, F

qs = Book.objects.annotate(
    author_id=F('author__pk'),
    genre_id=F('genre__pk')
).values('author_id', 'genre_id').annotate(
    num=Count('pk')
).order_by('author_id', 'genre_id')

但这不会给出您在此处指定的格式,但我们可以通过后处理来做到这一点:

from itertools import groupby
from operator import itemgetter

[
    {'id': k, 'genre': { v['genre_id']: v['num'] for v in vs }}
    k, vs for groupby(qs, itemgetter('author_id'))
]

关于python - Django 中如何统计外键属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59286317/

相关文章:

python - 从所有应用程序应用迁移和模型

python - 如何在 Python 中使用 urllib2 的 urlopen 关闭超时的 http POST?

jquery - 保存 Backbone.js 模型数据。数据发送不正确

python - Django:如何从 POST 请求获取任意模型

django - 当 Django 在 postgresql 中使用可序列化事务隔离级别时,哪些特定异常表示序列化失败?

python - 我怎样才能找到日期是否介于两个日期之间

python - Django:如何过滤某个科室的患者?

python - 使用 pyinstaller 将脚本转换为独立可执行文件时捕获 RTSP 流失败

Opencv 库中的 Python 函数原型(prototype)

python - python中两个巨大多维数组之间的距离和汇总计算加速