Задать вопрос
sakutylev
@sakutylev
junior python developer

Как вывести потомков в django?

Есть модель
class Person(model.Model)
    last_name = models.CharField(max_length=30, verbose_name='Фамилия')
    first_name = models.CharField(max_length=30, verbose_name='Имя')
    middle_name = models.CharField(max_length=30, verbose_name='Отчество')
    unit = models.ManyToManyField(Unit, verbose_name='Подразделение')
    position = models.ManyToManyField(Position, verbose_name='Должность')
    chief = models.ForeignKey('self', verbose_name='Руководитель', blank='True', null='True', related_name='chiefname')


Есть поле chief там хранится Начальник данного сотрудника, т.е. выводить начальника для каждого сотрудника просто.
Суть вопроса, как выводить потомков Person, нужно ли изменять поведение queryset?
Т.е. есть сотрудник у него несколько человек в подчинении, нужно отобразить в шаблоне этих людей.
  • Вопрос задан
  • 362 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 2
@reb00ter
Django developer
вот примерно так на мой взгляд
chiefs_by = Person.objects.filter(chief_id=person.id)

PS: только на мой взгляд получается очень странная структура данных. Персона может быть в нескольких подразделениях, на нескольких должностях, причём отдел и должность не связаны никак. но при этом под руководством только одной другой персоны.
По-моему логичнее делать что-то вроде
class Person(...):
  ...
  department = models.ManyToManyField('Department', verbose_name='подразделение', throught='PersonInDepartment')

class Department(..):
  chief = models.ForeignKeyField(Person,....)
  ...

class PersonInDepartment(...):
   person = ForeignKey
   department = ForeignKey
   position = ForeignKey
Ответ написан
Комментировать
@deliro
Несмотря на уже отмеченное решение, я всё-таки рискну показать нормальное и лаконичное решение, как должно быть.
Во-первых, related_name заюзано неверно (вы понимаете его смысл?). Переименуйте его в 'subordinates' или вообще удалите (будет 'person_set').
В этом случае, непосредственных подчинённых выводить нужно так:
person.subordinates.all()  # - все подчинённые
person.subordinates.filter(first_name='Иван')  # - подчинённые с настоящим русским именем
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы