使用django prefetch_related()获取上次活动的时间
我升级到Django 1.7,这样我就可以获得使用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
预取对象
,但我很难让它们按照预期的方式运行
我有这样一个员工模型:
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来查看查询,它们都是我所期望的,除了上一个活动前后每个模型实例的额外查询。