如何在Django模板中获取模型的对象数量?
在我的Django应用中,我是这样获取某个模型的所有对象的:
secs = Sections.objects.filter(order__gt = 5)
我把这些变量传给我的模板,这样我就可以访问模型的所有属性,比如 section.name
、section.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
。因为这个模型的一个实例只代表一本书的信息,而不是很多本书的信息。