2014-09-16 2 views
1

У меня есть модель 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) 

Я понимаю, что этот код, вероятно, довольно коряво, я все еще учусь!

Как вы, вероятно, понимаете, это даст мне только два уровня дочерних объектов.

Мой вопрос: что является самым эффективным способом, которым я могу написать этот код, чтобы он мог найти любую возможную категорию, пока не достигнет последнего объекта, у которого больше детей?

Спасибо!

+1

Заканчивать [Джанго-mptt] (https://github.com/django-mptt/django-mptt/) это приложение для обхода дерева. Вы можете найти решение в своем коде или, альтернативно, использовать сам django-mptt – Hevlastka

ответ

0

Вы можете попытаться использовать рекурсию что-то в этом направлении: Заменить список соответствующим типом данных.

def parseQueryset(queryset) 


    for x in queryset: 
     if isinstancex(x, list): 
      parseQueryset(x) 
     else: 
      #do stuff 
+0

Спасибо, что поделились этим. Как только я понял, что я хотел (рекурсия), я смог отработать оттуда! Очень признателен :) – otakumike

Смежные вопросы