Как использовать правильный 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 раза, особенно если у некоторых сотрудников один и тот же начальник.
- Он должен состоять из полной цепочки от самого низкого сотрудника до самого высокого (главного босса).
вы можете сделать это следующим образом:
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