Приветствую. Прошу помочь разобраться в таком вопросе. Есть модель категорий товара, с возможностью создавать подкатегории через models.ForeignKey('self')
class Category(models.Model):
name = models.CharField(max_length=100, help_text='Введите название категории', verbose_name='Категория товара', unique=True)
slug = models.SlugField(blank=True)
parent = models.ForeignKey('self', verbose_name='Родительская категория', blank=True, null=True, on_delete=models.CASCADE)
level = models.IntegerField(default=0, db_index=True)
description = models.TextField(verbose_name='Описание категории', blank=True)
def save(self, *args, **kwargs):
if self.parent_id:
self.level = self.parent.level + 1
super(Category, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('shop:category', args=[self.slug])
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'категории'
ordering = ['name']
def __str__(self):
return self.name
Для понимания уровня вложенности, есть поле level
, у которого 0 - это родительская категория, уровень первой вложенности это 1, второй -2 и т.д. В чем собственно суть вопроса - каким образом можно сразу, для конкретной родительской категории, выбрать все вложенные в неё подкатегории от 1-го до последнего уровня вложенности? Допустим 1-й уровень вложенности можно достать для конкретной категории через _set.all()
Но этот метод не видит глубже одного уровня зависимости. Т.е. для следующей подкатегории, чтобы узнать есть ли ещё вложенность, нужно снова обращаться к _set.all()
и т.д. до тех пор, пока эта вложенность не закончится. Беда этого подхода в том, что для любой категории, изначально неизвестна глубина вложенности, чтобы это можно было сделать в цикле с известным количеством повторений. Получается, что необходимо тогда создавать рекурсию, чтобы найти все зависимости.
Подскажите, как правильно это сделать.
Просматривал, как подобное реализовано в других е-магазинах - но там это либо вообще, если и используется, то неявно awesto/django-shop , либо непонятно как вообще реализовано django-oscar/django-oscar Похожий способ создавать подкатегории через ForeignKey('self'), использует Руслан RaD/dishop , но и у него я тоже не нашел, как можно при запросе родительской категории, получить всю глубину подкатегорий.
Для чего это мне? Допустим, на стартовой странице отображены лишь родительские категории для упрощения дизайна. Далее же, при выборе конкретной категории, на странице её детализации уже должны отображаться все зависимые от неё категории и подкатегории, ну и соответственно сам товар, который может быть починен самой глубокой подкатегории.
Заранее благодарен за помощь!
Updated 16 Feb. 2017, 13:31 by oleg_n.