Reputation: 45108
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
Reputation: 463
menus = Menu.objects.filter(parent__name__isnull=True)
{% for menu in menus %}
{% if menu.childs.count > 0 %}
...
{% endif %}
Upvotes: 0
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
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
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
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