SQL-запрос, чтобы избежать выборки всего вложенного набора, когда его части свернуты пользователем - PullRequest
0 голосов
/ 21 мая 2009

Я пытаюсь связать django-mptt и contrib.admin вместе, предоставив что-то более дружелюбное, чем простой список в админке. Поскольку деревья должны быть большими (иначе я бы не использовал вложенные множества), пользователи должны иметь возможность раскрывать и сворачивать их части.

Когда пользователь разворачивает или сворачивает или разворачивает ветвь (для этого используется ajax), также устанавливается cookie, содержащий разделенный запятыми список свернутых ветвей. Таким образом, в следующий раз, когда этот пользователь посетит администратора для моей модели на основе django-mptt, я могу показать ему дерево в том состоянии, в котором он его оставил. Теперь я хотел бы использовать этот список свернутых веток, чтобы облегчить нагрузку на мою базу данных, выбирая только необходимые части дерева.

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

1 Ответ

0 голосов
/ 21 мая 2009

Вы на самом деле не объясняете, что делаете, поэтому немного сложно помочь. (Что вы делаете с деревом? Как вы его отображаете? Что вы хотите, чтобы пользователи могли делать?)

Каждый элемент в дереве Django-MPTT имеет метод get_children() - и с помощью необязательного параметра include_self=True вы можете получить список элемента и всех его дочерних элементов. Вы можете использовать это для предварительной фильтрации поддеревьев, чтобы отображать только его части, если вы этого хотите.

Если вы хотите, чтобы пользователи могли динамически разворачивать и сворачивать части дерева без перезагрузки страницы, вам нужно будет использовать AJAX. Существуют различные древовидные элементы управления с поддержкой AJAX - я сам написал с помощью jQuery - и, без сомнения, один из них будет делать то, что вы хотите.

...