Python Django select_反向相关

Python Django select_反向相关,python,django,django-orm,Python,Django,Django Orm,我有以下型号: 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 = model

我有以下型号:

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\u related
,因为这只适用于另一种方式,例如:对于特定交易,
select\u 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

这可以正常工作,但就数据库被命中的次数而言,效率非常低。我想有更好的办法吗?类似于
选择与之相关的
但与之相反的内容?这是一种执行一个大型查询的方法,可以获得所有活动以及相关的头寸和交易,而不必逐一循环。

由于评论中的建议,我最终得到了以下工作解决方案:

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

参考

与预取相关的
如何?它执行单独的查找并更新python.prefetch_related中多个一和多个关系的实例,还通过.values()和.values_list()只获取所需的字段。非常好,谢谢。我知道与预回迁有关,但并不真正理解它的用途。直到现在。