使用django prefetch_related()获取上次活动的时间

使用django prefetch_related()获取上次活动的时间,django,Django,我升级到Django 1.7,这样我就可以获得预取对象,但我很难让它们按照预期的方式运行 我有这样一个员工模型: class Employee(Human): ... additional Employee Fields ... def get_last_activity_date(self): try: return self.activity_set.all().order_by('-when')[0:1].get().when except Act

我升级到Django 1.7,这样我就可以获得
预取对象
,但我很难让它们按照预期的方式运行

我有这样一个员工模型:

class Employee(Human):
  ... additional Employee Fields ...

  def get_last_activity_date(self):
    try:
        return self.activity_set.all().order_by('-when')[0:1].get().when
    except Activity.DoesNotExist:
        return None
还有像这样的活动

class Activity(models.Model):
  when = models.DateTimeField()
  employee = models.ForeignKey(Employee, related_name='activity_set')
我想使用prefetch_related获取此员工的最后活动日期。我试图用多种方式来表达这一点,但不管我怎么做,它最终都会生成另一个查询。我的另外两个与我的预回迁相关的部件工作正常,但这一个似乎从来没有为我保存任何查询

我在Django Rest框架中使用它,所以我真的需要预取_相关的部分来工作,因为我无法到达DRF内部来在queryset之外进行映射

以下是不起作用的方法之一

def get_queryset(self):

    return super(EmployeeViewSet, self).get_queryset()\
           .prefetch_related('phone_number_set', 'email_address_set')\
           .prefetch_related(Prefetch('activity_set', Activity.objects.all().order_by('-when')))\
           .order_by('last_name', 'first_name')
请注意,在activity_set prefetch查询中,我也不能切片以仅获取最新的条目,这是一个关于这将消耗多少内存的问题

我确实看到预回迁查询发生了,但是每个员工都会得到一个单独的信息查询,这意味着我有一个更大的浪费查询,仍然会得到我试图阻止的约200个查询


在这种情况下,您如何让预回迁相关信息为我工作?

我怀疑您没有理解与预回迁相关的
要点。文档指出这是预期的行为:许多查询和python中的“连接”。如果你想要更少的查询,你应该使用
select\u related
,我也不确定它是否适用于你的特定模型(问题中没有说明),因为select\u related适用于多对多关系

更新-文档:

另一方面,prefetch_related,对每个关系执行单独的查找,并在Python中执行“连接”


选定的\u related
不适用于此关系<代码>选择相关
仅当外键位于员工身上时有效。不是反向关系。当
prefetch\u related
工作时,您会得到一个针对所有员工的查询,然后从该查询中提取他们的数据。我怀疑您的模型在这里不支持select\u related。但是你对预回迁的含义是错误的。它将执行许多查询,在文档中是明确的。请仔细阅读,它会针对每个关系执行一个查询,而不是针对每个关系的每个模型。正如我上面所说的,另外两个与预回迁相关的程序工作得很好。这一个是不同的,因为它是试图得到许多最新的。我还使用DjDT来查看查询,它们都是我所期望的,除了上一个活动前后每个模型实例的额外查询。