Добрый день!
Никак не могу сообразить, как с помощью Django ORM составить запрос, в джанге сам новичек.
env
Django 3
Python 3.8
PostgreSQL 12
Имеются следующие модели (упрощены): Сотрудник, Отпуск, Отзыв из отпуска:
class Employee(models.Model):
username = models.SlugField(unique=True)
class Vacation(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
start_date = models.DateField()
end_date = models.DataField()
class VacationReview(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
start_date = models.DateField()
end_date = models.DataField()
Необходимо получить список сотрудников, которые не находятся в отпуске.
Условие получается:
= нет записей отпусков для сотрудника
или ( ( date.now() < отпуск.начало или date.now() > отпуск.конец ) и нет записей отзывов )
или ( есть записи об отзыве и ( date.now() >= отзыв.начало и date.now() <= отзыв.конец ) )
Буду благодарен, если укажите ссылки на информацию для лучшего понимания Django ORM в целом и сложных запросов в частности.
Зарание спасибо!
решение
Спасибо за помощь @bacon
class EmployeesAtWorkView(LoginRequiredMixin, generic.ListView):
model = Employee
template_name = 'registry/employee_list.html'
def get_queryset(self):
date = timezone.now()
not_dismissal = Q(dismissal_date__isnull=True) | Q(dismissal_date__gt=date)
not_vacation = Q(vacation__isnull=True) | (Q(vacation__start_date__gt=date) | Q(vacation__end_date__lt=date))
is_vacation_review = Q(vacationreview__isnull=False) & (Q(vacationreview__start_date__lte=date) & Q(vacationreview__end_date__gte=date))
return Employee.objects.filter(
not_dismissal &
( not_vacation |
is_vacation_review )
)
class EmployeesVacationView(LoginRequiredMixin, generic.ListView):
model = Employee
template_name = 'registry/employee_list.html'
def get_queryset(self):
date = timezone.now()
not_dismissal = Q(dismissal_date__isnull=True) | Q(dismissal_date__gt=date)
is_vacation = Q(vacation__isnull=False) | (Q(vacation__start_date__lte=date) & Q(vacation__end_date__gte=date))
not_vacation_review = Q(vacationreview__isnull=True) | (Q(vacationreview__start_date__gt=date) | Q(vacationreview__end_date__lt=date))
return Employee.objects.filter(
not_dismissal &
is_vacation &
not_vacation_review
)