在 Django 查询集中应用方法?

Apply method within a django queryset?

我有一个 Django 查询集,returns 所有餐厅的员工都叫 'bob'。它成功地做到了这一点:

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

但是,Staff 模型有一种方法,returns 只有在我想使用的给定日期雇用的员工。从本质上讲,我想要今天正在工作的所有鲍勃。我尝试将方法 .valid_on_certain_date(self, date.today()) 添加到查询中,但它使用餐厅 classes valid_on_certain_date 而不是员工 class 的 valid_on_certain_date 方法:

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()


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


我的querysets.py:

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

我的问题是,如何在 Restaurant.objects.filter(staff__staff_name="bob") 查询中按 valid_on_certain_date 筛选员工 class?

请注意,您永远不会从 Restaurant 模型中获得 StaffQuerySet。您最多可以使用 restaurant_qs.values_list('staff__id', flat=True).

获取员工的 ID

要获得 Staff 的 qs,您必须先获取餐厅 ID,然后调用 Staff 模型:

restaurant_ids = Restaurant.objects.values_list('id', flat=True)  # filter the restaurants more here
staff = Staff.objects.filter(
    staff_name='bob',
    restaurant__id__in=your_restaurant_ids
).valid_on_certain_date(date)

扩展 Queryset 不会单独工作,因为 Django 不知道您的自定义子类。我认为您需要的是自定义 manager。您可能根本不需要 Queryset 子类。