Как я могу получить все объекты модели и ее поля?

У меня есть модель продукта, и я хочу иметь возможность подсчитать все его объекты в методе, чтобы я мог вывести общее количество в шаблоне, то же самое для каждой категории, но я могу сделать это только с помощью метода number_of_likes.

class Category(models.Model):
    name = models.CharField(max_length=45)
    ...

class Product(models.Model):
    author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
    title = models.CharField(max_length=120, unique=True)
    category = models.ForeignKey(Category, default=None, on_delete=models.PROTECT)
    product_type = models.CharField(max_length=30, choices=TYPE, default='Physical')
    likes = models.ManyToManyField(User, related_name='like')
    ...

    def number_of_likes(self):
        return self.likes.count()

    def number_of_products(self):
        return self.Products.objects.all.count()

    def number_of_products_for_category(self):
        return Product.objects.filter(category_id=self.category_id).count()


    def __str__(self):
        return str(self.title) + ' from ' + str(self.author)



        <div>
            <h3>All products ({{ number_of_products }})</h3>
            {% for category in categories %}
                <p>{{ category.name }} (q)</p>
                {{ number_of_products_for_category }}
            {% endfor %}
        </div>

Не работают методы number_of_products и number_of_products_for_category.

Вы можете работать с:

def number_of_products_for_category(self):
    return Product.objects.filter(category_id=self.category_id).count()

Но если вы используете это для всех категорий, вы можете .annotate(..) [Django-doc] queryset:

from django.db.models import Count

categories = Category.objects.annotate(num_products=Count('product'))

и визуализировать с помощью:

{% for category in categories %}
    <p>{{ category.name }} ({{ category.num_products }})</p>
{% endfor %}

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

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