我有两个表/模型:
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中编写此查询?
发布于 2014-03-16 21:05:51
如果第一个(未修改的)查询返回qs =(不需要的/冲突的对象),那么您不能运行Employee.objects.all()并简单地排除gs (根据需要对剩余的对象进行排序吗?)
https://stackoverflow.com/questions/22431402
复制相似问题