How can I get the object count for a model in Django's templates?
Question:
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
Answers:
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.)
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.
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 }}
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
menus = Menu.objects.filter(parent__name__isnull=True)
{% for menu in menus %}
{% if menu.childs.count > 0 %}
...
{% endif %}
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
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.)
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.
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 }}
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
menus = Menu.objects.filter(parent__name__isnull=True)
{% for menu in menus %}
{% if menu.childs.count > 0 %}
...
{% endif %}