У меня есть такая структура моделей (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)
Но как ускорить код выше?