Suppose I have two table in my database,
booktable which have 3 attributes (id, book_name, writer_id(foreignkey))
writertable which have 2 attributes (id, writer_name)
I want to display writer name and how many books have that writer by calculate booktable
book table
---------------------------------------
| id | book_name | writer_id |
|-------------------------------------|
| 1 | abc | 2 |
| 2 | bcd | 1 |
| 3 | efg | 1 |
| 4 | htj | 2 |
| 5 | klm | 1 |
| 6 | nop | 3 |
|-------------------------------------|
Writer table
----------------------------
| id | writer_name |
|---------------------------
| 1 | xyz |
| 2 | bcb |
| 3 | eld |
| 4 | ccb |
|---------------------------
so,
id 1 = 3 books
2 = 3 books
4 = 0 books
How can I display in html template. Here is my code,
models.py
class book(models.Model):
book_name = models.CharField(max_length = 100)
writer = models.ForeignKey(writer, on_delete = models.CASCADE)
class writer(models.Model):
writer_name = models.CharField(max_length = 100)
def __str__(self):
return self.writer_name
view.py
def getwriters(request):
wrt = writer.objects.all()
return render(request, "writers.html", {"wrt":wrt})
writers.html
{% for p in wrt %}
<tr>
<td>{{ p.writer_name }}</td>
<td>{{**Should display how many books have this writer**}}</td>
</tr>
{% endfor %}
You can annotate the queryset with:
def getwriters(request):
wrt = writer.objects.annotate(
numbooks=Count('book')
)
return render(request, "writers.html", {"wrt":wrt})
This will add to every writer object an extra attribute numbook that contains the number of related books (so in this case books written by that writer).
You can then render it as:
{% for p in wrt %}
<tr>
<td>{{ p.writer_name }}</td>
<td>{{ p.numbooks }}</td>
</tr>
{% endfor %}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With