[英]How to count foreign key attribute values in Django
給定模型設置如下:
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'))
]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.