Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 8, 2016 09:05:48

Rudium
Зарегистрирован: 2015-12-06
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Организация иерархических меню

Какой формат данных лучше использовать для хранения иерархических меню? Нужна ли СУБД если количество всех (категорий включая вложенные) меню около 400. Меню будет выводиться в GUI таким образом: Выбрал категорию, появился список соответствующих подкатегорий и т. д.

Отредактировано Rudium (Янв. 8, 2016 10:28:41)

Офлайн

#2 Янв. 8, 2016 11:02:52

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Организация иерархических меню

Вопрос из разряда “Летели два жирафа, один большой другой на север. Сколько яблок у Васи?”.

Что за проект, какие меню (400 пунктов меню? вы серьезно?), как они будут редактироваться, как организуется иерархия - ничего не сказал. При таком подходе ответ на ваш вопрос - нет, вам не нужна СУБД.



Офлайн

#3 Янв. 8, 2016 11:39:35

Rudium
Зарегистрирован: 2015-12-06
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Организация иерархических меню

Десять категорий. Каждая категория содержит несколько подкатегорий, каждая подкатегория содержит несколько пунктов или подкатегорий с пунктами. Как файловая структура в ОС. Задача состоит в выборе способа хранения данных, для того, чтобы было удобно выводить в GUI возможность выбора пункта, находящегося в на любом уровне подкатегории. Например категория “Жирафы содержит две подкатегории: ”большие“ и ”летящие на север“. В свою очередь подкатегория ''большие” содержит пункт “любящие яблоки” и еще несколько пунктов. Подкатегория “летящие на север” содержит пункты “принадлежащие Васе” и еще несколько пунктов. Всего категорий и пунктов около 400 (рекурсивная функция обошла всю иерархию и посчитала) Уровень вложенности любого пункта не более 4. Сейчас данные хранятся в виде вложенных списков, примерно вот так:

menu = ['Категория1',['Подкатегория1',['Пункт1', 'Пункт2'', Пункт3']],'Категория2',['Подкатегория1',['Пункт1', 'Пункт2', 'Пункт3']]]
P.S Серьезно почти 400 элементов содержит меню. Это будет планировщик подачи объявлений на доску объявлений.

Офлайн

#4 Янв. 8, 2016 11:43:37

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Организация иерархических меню

Rudium
Сейчас данные хранятся в виде вложенных списков
Если они у вас уже как-то хранятся сейчас, то в чем суть вопроса?



Офлайн

#5 Янв. 8, 2016 11:49:10

Rudium
Зарегистрирован: 2015-12-06
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Организация иерархических меню

Вопрос не хранения, а удобства выборки. Если GUI запрашивает категорию, ее нужно найти, и вытащить входящие в нее пункты. Удобнее это делать запросом к СУБД а не собственным алгоритмом, который еще нужно придумать.)))

Офлайн

#6 Янв. 8, 2016 11:53:14

Rudium
Зарегистрирован: 2015-12-06
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Организация иерархических меню

Вот функция которая проходит все элементы дерева.

indent = ''# отступ
count = 0# количество элементов
def get_subcategory(obj):
    global indent
    global count
    if isinstance(obj, str):
        print(indent + obj)
        count += 1
    elif isinstance(obj[1], str):
        for row in obj:
            get_subcategory(row)
    else:
        for row in obj:
            get_subcategory(row)
            indent += '.'
get_subcategory(category) #category - древовидная иерархия вложенных списков.
print(count)

Офлайн

#7 Янв. 8, 2016 12:07:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Организация иерархических меню

То есть у вас названия категорий являются их же идентификаторами? А если в двух категориях будут пункты или подкатегории с одинаковыми названиями?
Сделайте нормальный класс дерева с узлами и ветвями.



Офлайн

#8 Янв. 8, 2016 12:41:15

Rudium
Зарегистрирован: 2015-12-06
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Организация иерархических меню

Спасибо за совет. Вы имеете ввиду нужно будеть задействовать OOП ?

Офлайн

#9 Янв. 8, 2016 12:44:49

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Организация иерархических меню

Дорогой, у вас 400 пунктов меню, гуёвое приложение, вы собираетесь использовать СУБД и спрашиваете задействовать ли вам ООП?



Офлайн

#10 Янв. 8, 2016 12:45:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Организация иерархических меню

# -*-coding:utf-8-*-
class Node:
    def __init__(self, name, verbose_name=None, parent=None):
        self.name = name
        self.parent = parent
        self.verbose_name = verbose_name or self.name
        self.children = []
    def add(self, node):
        self.children.append(node)
        if isinstance(node, Node):
            node.parent = self
    def __str__(self):
        return "{name}: [{children}]".format(name=self.verbose_name,
                                             children=", ".join(str(c) for c in self.children))
    def __getitem__(self, item):
        for c in self.children:
            if isinstance(c, Node):
                if c.name == item:
                    return c
class Tree:
    def __init__(self, root_node=None):
        self.root = root_node
    def set_root(self, name, verbose_name=None):
        node = Node(name, verbose_name)
        self.root = node
    def __getitem__(self, item):
        return self.root[item]
    def __str__(self):
        return str(self.root)       
t = Tree()
t.set_root("root", "Главная ветка")
r = t.root
r.add(Node("category1"))
r.add(Node("category2"))
r["category1"].add("Item1")
r["category1"].add("Item2")
r["category1"].add("Item3")
print(t)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version