Mridang Agarwalla
Mridang Agarwalla

Reputation: 45108

How can I get the object count for a model in Django's templates?

I'm my Django application I'm fetching all the objects for a particular model like so:

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

I pass this varbiles to my templates and i can access all the properties of the Model like section.name, section.id, etc.

There is a model called Books which has a FK to the Sections model. When i iterate over the secs varible in my template, how can i access the count of Books for each Section? Something like {{ sec.Books.count }}??

Thank you

Upvotes: 56

Views: 74930

Answers (5)

Gata
Gata

Reputation: 463

menus = Menu.objects.filter(parent__name__isnull=True)

{% for menu in menus %}

{% if menu.childs.count > 0 %}
...

{% endif %}

Upvotes: 0

Avishka Dambawinna
Avishka Dambawinna

Reputation: 1215

For Django 3.0, If the Book model is related to Section model,

{{ sec.books_set.all.count }}

The working is already mentioned in the answer by @Daniel Roseman

Upvotes: 0

Ramy M. Mousa
Ramy M. Mousa

Reputation: 5943

As for a 2019 answer. I would suggest making use of related_name while making your ForeignKey to look like that:

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

Then you can use it as follows:

{{ section.books.count }} 

or

{{ section.books|length }}

Upvotes: 7

Mbuso
Mbuso

Reputation: 328

Additionally to what Daniel said, Django creates reverse relationships automatically (as Daniel said above) unless you override their names with the related_name argument. In your particular case, you would have something like:

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

Then you can access the section's books count in the template by:

{{ sec.books.count }}

As you intimated in your question.

Upvotes: 17

Daniel Roseman
Daniel Roseman

Reputation: 600059

If Books has a ForeignKey to Sections, then Django will automatically create a reverse relationship from Sections back to Books, which will be called books_set. This is a Manager, which means you can use .filter(), .get() and .count() on it - and you can use these in your template.

{{ sec.books_set.count }}

(By the way, you should use singular nouns for your model names, not plurals - Book instead of Books. An instance of that model holds information for one book, not many.)

Upvotes: 92

Related Questions