@MAGistr_MTM
Учусь программировать

Фильтрация по дереву MP_Node?

У меня есть такая структура моделей (Django-Oscar):
from treebeard.mp_tree import MP_Node


class Category(MP_Node):
    name = models.CharField(_('Name'), max_length=255, db_index=True)
    ...

class ProductCategory(models.Model):
    product = models.ForeignKey(
        'catalogue.Product',
        on_delete=models.CASCADE,
        verbose_name=_("Product"))
    category = models.ForeignKey(
        'catalogue.Category',
        on_delete=models.CASCADE,
        verbose_name=_("Category"))

Мне нужно достать все категории, в которых есть продукты, или есть продукты в дочерних категорий. Можно как-то средствами Django и фильтров QuerySet дастать такие категории?

Вариант: достать QS, потом пробежать по нему и чекнуть есть ли продукты в категории или в дочерних - буду использовать напоследок, если ничего не поможет.

ПС. Если решить влоб, то как-то так:
qs = models.Category.objects.filter(
    depth=1, site=Site.objects.get_current()
)

categories_pks = []
for category in qs:
    category_descendants_and_self = category.get_descendants_and_self()
    for child_category in category_descendants_and_self:
        if models.Product.objects.browsable().filter(
            productcategory__category=child_category
        ).exists():
            categories_pks.append(category.pk)
            break
return models.Category.objects.filter(pk__in=categories_pks)

Но как ускорить код выше?
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы