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()只获取所需的字段。非常好,谢谢。我知道与预回迁有关,但并不真正理解它的用途。直到现在。