JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Django: Как получить список только тех категорий, в которых присутствует товар?

Всем доброго здоровья.
Существует две модели:
class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(blank=True)

    def __str__(self):
        return self.name

class Product(models.Model):
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    title = models.CharField(max_length=120)
    slug = models.SlugField(blank=True)
    description = models.TextField()
    price = models.DecimalField(max_digits=9, decimal_places=2)
    available = models.BooleanField(default=True)

    def __str__(self):
        return self.title


Вводная 1:
Категорий много. В каждой из них какая-то группа товаров. От 0 до 100. Это значит, что некоторые категории пустые ибо в них нет товаров.

Вопрос: Как во views.py выполнить запрос на список категорий, только тех в которых товары есть. Какой-нибудь хитрый count > 0 где-то в фильтр вставить. Я понимаю, что это сложный запрос SQL, но есть ли такая возможность средствами Django или нет? Или может быть нужно несколько запросов делать, но тогда как? (напишите код пожалуйста).

Вводная 2: Всё тоже самое. Только в модели Products есть ещё и количество
qty = models.IntegerField(default=0)

Вопрос 2: Как во views.py выполнить запрос (запросы) на список категорий, только тех в которых есть те товары, количество которых больше 0. Есть ли такая возможность реализации простыми средствами Django или нет? Или может быть нужно несколько запросов делать, но тогда как? (напишите код пожалуйста).

p.s. Полученный список будет передаваться через context в шаблон и использоваться в for. Нужны будут оба значения модели (category.title и category.slug).

p.s.2. У меня slug заполняется автоматически, если его нет, поэтому там blank=True (в общем не заморачивайтесь и не отвлекайтесь на это)

С уважением!
  • Вопрос задан
  • 1461 просмотр
Решения вопроса 1
JawsIk
@JawsIk Автор вопроса
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
Отправляю сюда ответ из своего же комментария. Метод через annotate.

1. В модели Product изменить строчку, чтобы появился параметр related_name:
category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name='p_category')


2. Во views.py импортировать модуль Count:
from django.db.models import Count

3. Выполнить запрос таким образом:
categories = Category.objects.annotate(one=Count('p_category')).filter(one__gt=0)


Результат аналогичен. Скорость и нагрузка между методами не сравнивалась и не проверялась.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы