Работая над одним проектом, я столкнулся с необходимостью хранить подразделения компании в виде древовидной структуры.
Я реализовал это так: упрощенная модель деления:
Отдел класса(модели.те.Модель): 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
-
Бесплатные Фильмы
19 Oct, 24 -
Строительство И Строительные Материалы
19 Oct, 24 -
Выпущен Linux Mint 9 «Айседора»
19 Oct, 24 -
Поисковик Quintura Выставили На Продажу
19 Oct, 24 -
Забудьте Об Опасности
19 Oct, 24 -
Представляем Аналитику Трафика Github
19 Oct, 24 -
Обзор Стартапа На Конференции Рит-2009
19 Oct, 24