【问题标题】:How to count foreign key attribute values in Django如何在 Django 中计算外键属性值
【发布时间】:2020-04-04 18:23:45
【问题描述】:

给定模型设置如下:

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

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

【问题讨论】:

标签: python django django-models


【解决方案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'))
]

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2022-01-20
    • 2015-10-04
    • 1970-01-01
    • 2018-11-18
    • 2010-12-31
    相关资源
    最近更新 更多