Django -Отображение списка категорий поста с номером поста
Здравствуйте, я пытаюсь сделать шаблон в django, который отображает таблицу категорий постов и количество постов вместе с ней. Я не могу сделать это правильно, используя annotate при выполнении запросов к моей модели.
views.py
categorylistcount = Post.objects.all().annotate(posts_count=Count('category'))
for obj in categorylistcount:
print(obj.category + ' : ' + obj.categories_count) #test
вместо этого я получаю список постов, который имеет ключ posts_count со значением 1
models.py
class Post(models.Model):
title = models.CharField(max_length=255)
author = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE
)
body = models.TextField()
category = models.CharField(max_length=64, default="Uncategorized")
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title + ' | ' + str(self.author)
def get_absolute_url(self):
return reverse('blog:post-detail', kwargs={"pk": self.pk})
class Category(models.Model):
name = models.CharField(max_length=225)
def __str__(self):
return self.name
где я промахнулся? Спасибо
Итак, после глубокого понимания модели и querysetapi в документах django, я немного изменил свои модели и то, как я получаю список объектов
В models.py не было связи между моделью Post и моделью Category, поэтому даже если можно запросить список категорий с количеством постов, используя только модель Post, неправильно не использовать модель categories. (я использую ее только для того, чтобы сделать значение опций в моем select input на шаблоне first)
Models.py
category = models.ForeignKey(Category, on_delete=models.CASCADE)
имея связь с категориями, вы можете сделать запрос к объекту категорий и добавить количество постов с помощью annotate.
categories_list = Category.objects.annotate(posts_count=Count('post'))
print(categories_list.values())
об этом говорится в документации django aggregation, https://docs.djangoproject.com/en/4.0/topics/db/aggregation/ надеюсь, это поможет кому-нибудь, кто также застрял в составлении запросов