Не удается отобразить название категории с количеством статей django

Я пытаюсь показать количество статей в каждой категории в моем проекте django. Но он показывает id категории вместо имени_категории. Я хочу отобразить название_категории и соответствующее количество статей.

blog/views.py

def searchView(request):
    statistics = Post.objects.values('cid').annotate(num_articles = Count('cid')).order_by()
    return render(request, 'blog/search.html', {'statistics': statistics})

blog/search.html -> здесь stat.cid показывает id категории, но я хочу показать здесь имя_категории.

{% extends 'users/base.html' %}
{% block content %}
<div class="container">
    <br>
    <div class="row text-center">
        <div class="col-md-3"> </div>
        <div class="col-md-6">
            <!-- <% if (statistics.length> 0){ %> -->
                <h4 class="p-2 mb-2 bg-secondary text-white">POPULAR CATEGORIES!!</h4>
                <table id="myTable" class="table table-bordered table-hover table-striped shadow-sm bg-white rounded">
                    <thead>
                        <tr>
                            <th>Category</th>
                            <th>Articles Available</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for stat in statistics %}
                            <tr>
                                <td>
                                    {{ stat.cid }}
                                </td>
                                <td>
                                   {{ stat.num_articles }}
                                </td>
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>
            <!-- <% } %> -->
        </div>
    </div>
</div>
{% endblock content %}

blog/models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth import get_user_model
from django.urls import reverse
from ckeditor.fields import RichTextField

# Create your models here.
class Category(models.Model):
    cid = models.AutoField(primary_key=True) 
    category_name = models.CharField(max_length=100)

    def __str__(self):
        return self.category_name


class Post(models.Model):
    aid = models.AutoField(primary_key=True)
    image = models.ImageField(default='blog-default.png', upload_to='images/')
    title = models.CharField(max_length=200)
    content = RichTextField()
    created = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    cid = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='specialization')
    approved = models.BooleanField('Approved', default=False)
    like = models.ManyToManyField(get_user_model(), related_name='likes', blank=True)

    def __str__(self):
        return self.title
 

Post.objects.values('cid') даст вам только pk из Category. Чтобы получить доступ к category_name из Category, вы должны также включить это в values():

# Note the double underscore between cid and category_name
`Post.objects.values('cid', 'cid__category_name')`

Теперь, когда category_name доступен, обратитесь к нему в шаблоне следующим образом:

{{ stat.cid__category_name }}

Хотя это специфично для вашего случая, лучший ответ можно найти здесь:
https://stackoverflow.com/a/27181936/10951070

Я бы подошел к этому с противоположного направления, то есть я бы получил доступ к этим данным из Category, а не из Post, который вы почему-то называете statistics.

Сначала я бы предложил вам использовать ListView, а затем я бы поступил следующим образом:

# views

from django.views.generic import ListView

class CategoryListView(ListView):
    model = Category
    template_name = 'blog/search.html'
    context_object_name = "categories"
# template
<table>
    <thead>
    ...
    </thead>
    <tbody>
        {% for category in categories %}
            <tr>
                <td>{{ category.cid }}</td>
                <td>{{ category.post_set.count }}</td>
            </tr>
        {% endfor %}
    </tbody>
</table>

Если вы добавите related_name в вашу модель Post в атрибуте cid и назовете ее posts, вы можете затем в шаблоне написать category.posts.count, что более читабельно. Это просто личное предпочтение и определенно не правило.

Вернуться на верх