【问题标题】:Django - Filtering prefetch_relatedDjango - 过滤 prefetch_related
【发布时间】:2014-01-22 00:15:02
【问题描述】:

我无法过滤我的观点之一。它是一个 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 的关系作为模板。如果我只是遍历 context['opportunities'] 并将所需的活动添加到每个活动中,它每次都会访问数据库。遗憾的是,prefetch_related 过滤仅在开发版本中,大约 5 个月后稳定发布。

【问题讨论】:

    标签: python sql django


    【解决方案1】:

    select_related 会代替你工作吗?

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

    或者,向后工作:

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

    【讨论】:

    • 嗨,不幸的是,select_related 不适用于这些后向关系,因为它每次都会访问数据库,就好像没有这样的东西一样。还有,后面的东西对我也行不通,我在上一段解释过,写的和你差不多,因为我需要有与Stage相关的机会,并且每个Opportunity都有相关的Activity。否则我必须遍历模板中每个阶段的机会,并检查是否有机会.stage_id == stage.id,这是非常低效的。机会下的活动也是如此。
    • 那么我想您可以查询每个模型以获取您感兴趣的行集(很像 NoSQL)。或者您可以插入正在开发的代码并帮助他们进行调试。
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 2019-03-16
    • 2016-02-26
    • 2015-08-23
    • 2019-03-03
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多