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

Mri*_*lla 34 python django django-models

我是我的Django应用程序我正在获取特定模型的所有对象,如下所示:

secs = Sections.objects.filter(order__gt = 5)
Run Code Online (Sandbox Code Playgroud)

我通过这个varbiles到我的模板,我可以访问模型像所有的属性section.name,section.id等等.

有一个叫模型Books具有FK的Sections模型.当我secs在模板中迭代varible时,如何访问每个Section的Books数?有点喜欢{{ sec.Books.count }}

谢谢

Dan*_*man 71

如果Books有一个ForeignKey Sections,那么Django会自动创建一个从Sections返回Books的反向关系,这将被调用books_set.这是一个经理,这意味着你可以使用.filter(),.get()并且.count()它-你可以在你的模板中使用这些.

{{ sec.books_set.count }}
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,你应该使用单数名词作为你的模型名称,而不是复数 - Book而不是Books.该模型的一个实例保存一本书的信息,而不是很多.)


Mbu*_*uso 10

除了Daniel所说的,Django会自动创建反向关系(如Daniel所述),除非您使用related_name参数覆盖其名称.在你的特定情况下,你会有类似的东西:

class Book(models.Model):
    section = models.ForeignKey(Section, related_name="books")
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过以下方式访问模板中的部分书籍计数:

{{ sec.books.count }}
Run Code Online (Sandbox Code Playgroud)

正如你在问题中暗示的那样.


Ram*_*usa 5

至于2019年的答案。我建议related_name在使您ForeignKey看起来像这样的同时使用:

section = models.ForeignKey(Section, on_delete=models.SET_NULL, related_name='books')
Run Code Online (Sandbox Code Playgroud)

然后您可以按如下方式使用它:

{{ section.books.count }} 
Run Code Online (Sandbox Code Playgroud)

或者

{{ section.books|length }}
Run Code Online (Sandbox Code Playgroud)