Как использовать правильный queryset в django?

Есть модель:

class Employee(models.Model):
    name = models.CharField(max_length=100)
    position = models.CharField(max_length=100)
    hired_at = models.DateField(auto_now=True)
    salary = models.DecimalField(max_digits = 9, decimal_places= 2)
    boss = models.ForeignKey('self', null=True,blank=True, on_delete=models.CASCADE)
    has_boss = models.BooleanField(null=True)
    is_visited = models.BooleanField(null=True)

И есть BAD queryset в просмотре:

 def get_queryset(self):
        return reversed(Employee.objects.all())

Мне нужен конкретный запрос:

  1. Нужно, чтобы все сотрудники были только один раз для набора запросов. Сейчас я показываю в шаблоне многих сотрудников более 1 раза, особенно если у некоторых сотрудников один и тот же начальник.
  2. Он должен состоять из полной цепочки от самого низкого сотрудника до самого высокого (главного босса).

вы можете сделать это следующим образом:

def get_employees_filters(self, include_self=True):
    filters = Q(pk=0)
    if include_self:
        filters |= Q(pk=self.pk)
    for c in Employee.objects.filter(parent=self):
        _r = c.get_employees_filters(include_self=True)
        if _r:
            filters |= _r
    return filters
def get_all_employees(self, include_self=True):
    return Employee.objects.filter(self.get_employees_filters(include_self))

посмотрите эту тему для более глубокого понимания: https://medium.com/@tnesztler/recursive-queries-as-querysets-for-parent-child-relationships-self-manytomany-in-django-671696dfe47

Вернуться на верх