dar*_*ool 5 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 = models.ForeignKey(Position)
some_trade_field = models.CharField()
Run Code Online (Sandbox Code Playgroud)
换句话说,我的广告系列可以有多个职位。反过来,广告系列中的每个头寸可以有多个交易。
是否有一种有效的方法(即:最少的数据库调用)来选择一个市场活动及其所有相关的头寸和交易。看起来我无法使用,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
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,但是在命中数据库的次数方面效率很低。我有更好的方法吗?某些东西与之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))
Run Code Online (Sandbox Code Playgroud)
编辑:应该添加此导入
from django.db.models import Prefetch
Run Code Online (Sandbox Code Playgroud)
参考 预取文档
| 归档时间: |
|
| 查看次数: |
2332 次 |
| 最近记录: |