Применить метод внутри кверисета 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.