Древовидные Объекты В Джанге

Работая над одним проектом, я столкнулся с необходимостью хранить подразделения компании в виде древовидной структуры.

Я реализовал это так: упрощенная модель деления:

Отдел класса(модели.

Модель): name=models.CharField(maxlength=255,null=False,blank=False) code=models.CharField(maxlength=15,unique=True,null=False,blank=False) путь = модели.

CharField (maxlength = 255, null = False, редактируемый = False) родитель = модели.

ForeignKey('self',null=True,blank=True)

те.

модель ссылается на себя.

Ключевое слово здесь — путь: здесь мы будем хранить «путь» к текущей модели через всех предков.

Чтобы сгенерировать его автоматически, мы переопределяем save:

защита сохранения (сам): если сам.

родитель: self.path='%s%s/' % (self.parent.path,self.code) еще: self.path='/%s/'%self.code супер(тип(сам),сам).

сохранить() для a в Department.objects.filter(parent=self.id): а.

сохранить()

Таким образом, при сохранении объекта поле пути всех его потомков «перегенерируется».

Теперь простым запросом можно выбрать, скажем, всех сотрудников данного отдела и всех вложенных в него подразделений:

Staff=Staff.objects.filter(department__path__startswith=department.path)
Для окончательной красоты давайте определим __str__ для объекта Department:
защита __str__(сам): return "%s%s" % ('------'[:self.path.count('/',2)-1],self.name)
Теперь во всех формах при выборе подразделения будет видна степень его вложенности.

Теги: #python #django #Chulan

Вместе с данным постом часто просматривают: