DKuksenok
@DKuksenok

Django ORM: фильтрация пользователей не в отпуске [создание запроса]?

Добрый день!
Никак не могу сообразить, как с помощью 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
        )

  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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