У меня есть модель Django, которая определяет список категорий. Каждая категория может быть ребенком другой категории, и возможно, что глубина этого списка категорий может продолжаться довольно много.Итерирование через неограниченное количество дочерних объектов в Django-запросе
models.py
class Category(models.Model):
code = UUIDField(unique=True, primary_key=True)
name = models.CharField(max_length=100, null=True, blank=True, unique=True)
parent_cat = models.ForeignKey('self', null=True, blank=True)
Рассмотрим, например, категория для женской одежды. Это может иметь что-то вроде следующего:
Женская> Одежда> Платья> Летний
Это все работает отлично, но отдельно я хочу построить функцию, которая может построить единый список, содержащий экстраполировать вид каждый категории в дереве. Чтобы сделать это, я написал следующее:
queryset = Category.objects.filter(parent_cat=kwargs['code'])
all_children = []
all_children.append(queryset.values())
for c in queryset:
children = Category.objects.filter(parent_cat=c.code)
if children:
all_children.append(children.values())
all_children.append(children)
Я понимаю, что этот код, вероятно, довольно коряво, я все еще учусь!
Как вы, вероятно, понимаете, это даст мне только два уровня дочерних объектов.
Мой вопрос: что является самым эффективным способом, которым я могу написать этот код, чтобы он мог найти любую возможную категорию, пока не достигнет последнего объекта, у которого больше детей?
Спасибо!
Заканчивать [Джанго-mptt] (https://github.com/django-mptt/django-mptt/) это приложение для обхода дерева. Вы можете найти решение в своем коде или, альтернативно, использовать сам django-mptt – Hevlastka