鉴于模型设置如下:
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}}]
这可以通过查询每种类型的Author来轻松实现,但是这将导致[作者数] * [类型数]查询。我想找到一种更有效的方法。
答案 0 :(得分:1)
我们可以在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'))
]