Джанго: Лучший способ для простой иерархии? - PullRequest
3 голосов
/ 02 декабря 2010

У меня есть эта модель:

class Category(models.Model):
    name = models.CharField()
    description = models.CharField(blank=True)
    parent = models.ForeignKey('self', blank=True, null=True)

Я хочу, чтобы Django отсортировал категории по их иерархии, например:

  • Родитель 1
    • Ребенок 1
  • Родитель 2
    • Ребенок 1

Я провел небольшое исследование и обнаружил, что 2 приложения, treebeard.al_tree и Django MPTT, оба являются мощными, что может привести к снижению производительности или усложнению в обслуживании.

Я буду отображать категории на боковой панели веб-сайта и внутри страниц администратора (включая ForeignKey в модели сообщений), будет очень мало добавлений / модификаций / удалений к категориям, в основном только для чтения, что не должно сильно влиять на производительность. *

Есть ли другое приложение, которое предлагает это и проще, чем те, что указаны выше? Можно ли добиться этого с помощью Django без дополнительных приложений, с помощью менеджеров или чего-то еще?

Ответы [ 3 ]

4 голосов
/ 02 декабря 2010

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

4 голосов
/ 02 декабря 2010

Я не вижу никаких недостатков при использовании такого приложения, как django-mptt. Фактически, предоставляемые им методы оптимизированы для обеспечения максимальной производительности при выполнении запросов с иерархическими структурами. У меня нет причин для беспокойства по поводу ремонтопригодности и / или производительности, и его довольно просто использовать!

2 голосов
/ 02 декабря 2010

Использование MPTT позволяет системе работать. Когда вы реализуете это самостоятельно, вы можете в конечном итоге соединить узлы вместе вручную (функция ~ 30 строк) или выполнить отдельные запросы для всех подуровней. Там было много ручной работы. Сделали это.

С помощью алгоритма MPTT поддерево может быть выбрано в одном запросе. Это обычный алгоритм для хранения иерархических данных.

Django MPTT (особенно v0.4) имеет несколько хороших API для правильного отображения всех этих данных в админке и шаблонах. Вам не нужно изобретать велосипед.

...