使用django查询查找最可用的员工

使用django查询查找最可用的员工,django,Django,我有两个表/模型: class Employee(models.Model): name = models.CharField(...) class Shift(models.Model): start_at = models.DateTimeField() end_at = models.DateTimeField() employee = models.ForeignKey(Employee, related_name="shift_set") 我需要一份

我有两个表/模型:

class Employee(models.Model):
    name = models.CharField(...)

class Shift(models.Model):
    start_at = models.DateTimeField()
    end_at = models.DateTimeField()
    employee = models.ForeignKey(Employee, related_name="shift_set")
我需要一份在指定日期范围内可以轮班的所有员工的名单。我希望此列表按可用性排序(最可用的在顶部)。我有一个部分有效的查询:

qs = Employee.objects.filter(shift_set__start_at__gte=start_at,
                             shift_set__end_at__lte=end_at
                             ).annotate(overlapping_events=models.Count('shift_set'))
return qs.order_by('overlapping_events', 'last_name', 'first_name')
这个查询的问题是我只得到有冲突的人,而不是那些没有冲突的人。没有排班的员工不会出现在此列表中,即使他们应该在列表的顶部。我如何也包括在此日期范围内没有轮班的员工

所以我稍微修改了一下:

qs = Employee.objects.filter(
    Q(shift_set__isnull=True)
    | Q(shift_set__start_at__gte=start_at, shift_set__end_at__lte=end_at)).annotate(
        overlapping_events=models.Count('shift_set__employee__id'))
return qs.order_by('overlapping_events', 'last_name', 'first_name')
但在100名员工中,有20名仍然被排除在外,这20名员工有轮班,但没有冲突

如何在Django中编写此查询?

如果第一个(未修改的)查询返回qs=(不需要的/冲突的对象),那么您不能运行Employee.objects.all()并简单地排除gs(根据需要排序剩余的对象吗?)