Применить метод внутри кверисета django?

У меня есть Django queryset, который возвращает всех сотрудников по имени "bob", работающих во всех моих ресторанах. Он успешно выполняет следующее:

restaurant_staff = Restaurant.objects.filter(staff__staff_name="bob")

Однако в модели Staff есть метод, который возвращает только тех сотрудников, которые были заняты на определенную дату, которую я хотел бы использовать. По сути, мне нужны все сотрудники, работающие сегодня. Я пробовал добавить метод .valid_on_certain_date(self, date.today()) в запрос, но он использует классы Restaurant valid_on_certain_date, а не метод valid_on_certain_date класса Staff:

restaurant_staff = Restaurant.objects.filter(staff__staff_name="bob").valid_on_certain_date(self, date.today())

Упрощенная версия моего models.py:

class Restaurant(models.Model):
    restaurant_name = models.CharField(max_length=30)
    restaurant_dates_open = DateRangeField()

    def valid_on_certain_date(self, date):
        return  self.filter(restaurant_dates_open__contains=date)


class Staff(models.Model):
    staff_name = models.CharField(max_length=30)
    restaurant = models.ForeignKey(Restaurant)
    employment_dates = DateRangeField()

    def valid_on_certain_date(self, date):
        return  self.filter(employment_dates__contains=date)

Мой вопрос в том, как я могу отфильтровать класс сотрудников по valid_on_certain_date в запросе Restaurant.objects.filter(staff__staff_name="bob")?

Обратите внимание, что вы никогда не получите StaffQuerySet из модели Restaurant. В лучшем случае вы можете получить идентификаторы сотрудников, используя restaurant_qs.values_list('staff__id', flat=True).

Чтобы получить qs из Staff, вам придется сначала получить идентификаторы ресторанов, а затем вызвать модель Staff:

restaurant_ids = Restaurant.objects.all().values_list('id', flat=True)
staff = Staff.objects.filter(
    staff_name='bob',
    employment_dates__contains=date,
    restaurant__id__in=your_restaurant_ids
)

Расширение Queryset само по себе не сработает, потому что Django не знает о вашем пользовательском подклассе. Я думаю, что вам нужен пользовательский manager. Возможно, вам вообще не нужен подкласс Queryset.

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