繁体   English   中英

Django select_related相反

[英]Django select_related in reverse

我有以下模型:

class Campaign(models.Model):
    some_campaign_field = models.CharField()

class Position(models.Model):
    campaign = models.ForeignKey(Campaign)
    some_position_field = models.CharField()

class Trade(models.Model):
    position = models.ForeignKey(Position)
    some_trade_field = models.CharField()

换句话说,我的广告系列可以有多个职位。 反过来,广告系列中的每个头寸可以有多个交易。

是否有一种有效的方法(即:最少的数据库调用)来选择一个市场活动及其所有相关的头寸和交易。 看起来我不能使用select_related因为这只能以其他方式起作用,例如:对于特定的交易, select_related将获得所有关联的头寸。

目前,我正在嵌套循环中执行以下操作:

campaigns = Campaign.objects.get()
for campaign in campaigns:
    positions = campaign.position_set.all()
    for position in positions:
        trades = position.trade_set.all()
        # do stuff

这可以正常工作,但是在命中数据库的次数方面效率很低。 我有更好的方法吗? select_related但相反吗? 一种进行大型查询的方法,以使所有营销活动以及相关的头寸和交易都无需逐一遍历。

由于评论中的建议,我得出了以下可行的解决方案:

open_campaigns = list(Campaign.objects.prefetch_related(
                                       Prefetch('position_set',
                                                queryset=Position.objects.all(),
                                                to_attr='cached_positions'),
                                       Prefetch('cached_positions__trade_set',
                                                to_attr='cached_trades'),
                                       ).filter(exit_datetime__isnull=True))

编辑 :应该添加此导入

from django.db.models import Prefetch

参考 预取文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM