[英]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.