我有一份员工名单,我想知道他们最后完成的活动。
class Employee(Human):
... additional Employee Fields ...
def get_last_activity(self):
try:
return self.activity_set.all().order_by('-when')[0:1].get()
except Activity.DoesNotExist:
return None
上面的 get_last_activity
将针对单个实例执行我想要的操作。但是,如果我为列表中的每个员工调用一次这种方法,我会追加几百个额外的查询。
活动如下:
class Activity(models.Model):
when = models.DateTimeField()
employee = models.ForeignKey(Employee, related_name='activity_set')
...additional activity fields...
查询如下所示:
Employee.objects.all.annotate(last_activity_timestamp=Max('activity_set__when'))\
.filter(Q(activity_set__when__lte=timezone.now())
| Q(activity_set__when__isnull=True))\
.order_by('last_name', 'first_name')
活动列表包括未来计划的活动,因此我必须使用activity_set__when__lte=timezone.now()
这会在运行查询时为我提供一个名为last_activity_timestamp的额外成员的员工记录。我想得到last_activity的整个活动记录,而不仅仅是注释中的一部分。
英语:给我列表中的每个员工,并在每个员工中包含他们在名为last_activity的字段中执行的最后一项活动的所有详细信息。在一个查询中执行此操作。
这已经证明非常难以实现,所以我必须遗漏一些基本的东西。
这个问题类似于this one,这是我为获得相同的最终结果而采取的另一种方法。他们俩都没做我想做的事。