@ForestGumo

Как иерархически вывести данные из Django?

Есть модель:
class Menu(models.Model):
    name = models.CharField(max_length=150)
    parent = models.ForeignKey(
        'self',
        on_delete=models.CASCADE,
        blank=True,
        null=True,
        related_name='parent_name')

    def __str__(self):
        return self.name

Есть следующая функция.

def index(request, name='Magomed'):

    menu_item = Menu.objects.raw('''
            WITH RECURSIVE menu AS (
                SELECT id, parent_id, name
                FROM app_menu
                WHERE name = %s

            UNION

            SELECT app_menu.id, app_menu.parent_id, app_menu.name
            FROM app_menu
                JOIN menu
                    ON app_menu.parent_id = menu.id OR app_menu.id = menu.parent_id)
                    
            SELECT * FROM menu;''', [name])


Как иерархически вывести данные с полученного query? То есть, чтобы id == parent_id.
Через template tag это как то сделать, через цикл в список добавлять или в самом SQL это можно реализовать?
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Jack444
Надо в меню добавить ещё поле что-то вроде:
lvl = SmallIntegerField()
Потом можно попробывать сделать так:
menu = Menu.objects.select_related('parent').filter(lvl=1)

Но таким образом не уверен что выше второго уровня в один запрос уложатся.
Надёжней в ручную поправить:
menu = Menu.objects.values()

def join_parents(qs: list[dict]): -> list[dict]:
    for i in qs: i['parents'] = join_parents([x for x in qs if x['parrent']==i['id']])
    return qs

join_parents(menu)
menu = [i for i in menu if i['lvl'] == 1]
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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