如何在Django中使用联接查询?

时间:2018-11-09 08:56:26

标签: django

我有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

我该怎么办?

1 个答案:

答案 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') 个字典,每个字典将包含两个键:QuerySetname。但是请注意,使用这种方法,如果两位作者的名字相同,那么这将导致一本词典的书数“累加”,这可能不是 你想要的。