在 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
子类。
我有一个 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)
.
要获得 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
子类。