Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django : count foreign key and display

Suppose I have two table in my database,

  1. booktable which have 3 attributes (id, book_name, writer_id(foreignkey))

  2. 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 %}
like image 660
Sajal Ahmed Avatar asked Nov 21 '25 13:11

Sajal Ahmed


1 Answers

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 %}
like image 193
Willem Van Onsem Avatar answered Nov 24 '25 03:11

Willem Van Onsem



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!