如何在Django模板中获取模型的对象数量?

55 投票
5 回答
72635 浏览
提问于 2025-04-16 02:14

在我的Django应用中,我是这样获取某个模型的所有对象的:

secs = Sections.objects.filter(order__gt = 5)

我把这些变量传给我的模板,这样我就可以访问模型的所有属性,比如 section.namesection.id 等等。

有一个模型叫 Books,它和 Sections 模型有外键关系。当我在模板中遍历 secs 变量时,我该如何获取每个Section的Books数量呢?像 {{ sec.Books.count }} 这样可以吗?

谢谢

5 个回答

7

关于2019年的一个回答。我建议在创建你的ForeignKey时使用related_name,可以这样写:

section = models.ForeignKey(Section, on_delete=models.SET_NULL, related_name='books')

然后你可以这样使用它:

{{ section.books.count }} 

或者

{{ section.books|length }}
17

除了丹尼尔说的那些,Django会自动创建反向关系(就像丹尼尔上面提到的),除非你用related_name这个参数来覆盖它们的名字。在你的具体情况下,你会得到类似这样的东西:

class Book(models.Model):
    section = models.ForeignKey(Section, related_name="books")

然后你可以在模板中通过以下方式访问这个部分的书籍数量:

{{ sec.books.count }}

就像你在问题中提到的那样。

91

如果Books表里有一个指向Sections表的外键,那么Django会自动在Sections表里创建一个反向关系,叫做books_set。这个books_set就像一个管理器,你可以在上面使用.filter().get().count()这些方法,而且你还可以在你的模板中使用它们。

{{ sec.books_set.count }}

顺便说一下,模型的名字应该用单数形式,而不是复数形式——用Book而不是Books。因为这个模型的一个实例只代表一本书的信息,而不是很多本书的信息。

撰写回答