我有2张桌子,分别是作者和书。
在作者表中,我有“ id”和“ name”字段。
在书本表中,我有“ book_id”和“ author_id”(外键)。
这是我的sql语句。它在我的数据库中有效。
select "Author"."Name",count("BookId")
from "Author"
join "Book" on "Book"."AuthorId" = "Author"."Id"
group by "Author"."Name"
作者-model.py
class Author(models.Model):
id = models.AutoField(db_column='Id', primary_key=True)
name = models.CharField(db_column='Name', max_length=50)
书-model.py
class Book(models.Model):
id = models.AutoField(db_column='BookId', primary_key=True)
authorid = models.ForeignKey('authors.Author', models.DO_NOTHING, db_column='AuthorId')
现在,我想获得一个count of book.id
分组的AuthorId
,它可以从Author表中获取AuthorName
。
我该怎么办?
答案 0 :(得分:2)
通常,您可以注释您的对象,例如:
Author.objects.annotate(book_count=Count('book'))
将给您QuerySet
中的Author
,其中每个Author
(源自 this QuerySet
)都具有一个属性.book_count
和书数。
您建议的查询稍有不同,因为您将name
的{{1}}分组,在这种情况下,查询为:
Author
这将产生Author.objects.values('name').annotate(book_count=Count('book')).order_by('name')
个字典,每个字典将包含两个键:QuerySet
和name
。但是请注意,使用这种方法,如果两位作者的名字相同,那么这将导致一本词典的书数“累加”,这可能不是 你想要的。