Django - 过滤prefetch_related

时间:2014-01-22 00:15:02

标签: python sql django

我无法过滤我的一个观点。它是一个DetailView,它还显示了许多其他表。 我有我的模型:

 class Pipeline(models.Model):

 class Stage(models.Model):
     pipeline = models.ForeignKey(Pipeline, related_name='stages')

 class Opportunity(models.Model):
     status = ....
     stage = models.ForeignKey(Stage, related_name='opportunities')

 class EstateActivity(models.Model):
      time = models.DateTimeField(...)
      opportunity = models.ForeignKey(EstateOpportunity, related_name='activities')

现在,我正在显示Pipeline DetailView。在这个DetailView中,我使用了与所有这些模型相关的预取

qs.filter(users=self.request.user).prefetch_related('stages__opportunities__activities')

一个管道包含许多阶段,每个阶段包含许多机会等。 但是,我需要根据状态(可以从URL获取)首先筛选出机会。对于每个机会,我需要过滤一个特定的活动(最近的活动,如果不存在,那么最近的过去)。到目前为止,我尝试使用额外的,但这不起作用。我没有想出一个每次都不涉及数据库的解决方案。另外,我不能一个一个地选择每个模型

context['opportunities'] = Opportunity.objects.filter(user=..., ..pipeline=self.object, status=.....)

因为我需要与Stage for template有关系。如果我只是迭代上下文['opportunity']并将所需的Activity添加到每个,它每次都会命中数据库。遗憾的是,prefetch_related过滤仅在开发版本中,在大约5个月内稳定发布。

1 个答案:

答案 0 :(得分:0)

select_related会为你工作吗?

qs.filter(users=self.request.user).select_related('stages')

或者,向后工作:

opportunities = EstateActivity.objects.filter(opportunity__stage__pipeline__users=self.request.user)