我有一个具有多对多关系的模型(涉及3个实体的2个中间表)
看起来像这样:
Project->(project_tag)-> Tag->(intent_tag)-> Intent
我想检索X个Intent,并为每个Intent检索所有标签和所有项目。
对于一个简单的prefetch()
关系,我可以使用一个many-to-many
用2个查询(而不是可以自动完成的100个查询)来做到这一点,但是我找不到如何用一个查询来做到这一点。更多-to-many
关系...
我尝试了很多事情,例如:
intent_query = Intent.select().paginate(1, 4)
intent_tag_query = IntentTag.select(IntentTag, Tag, Intent, ProjectTag, Project) \
.join(Intent) \
.switch(IntentTag) \
.join(Tag) \
.join(ProjectTag).join(Project) \
.where(IntentTag.intent.in_(intent_query))
combo_query = prefetch(intent_query, intent_tag_query)
result = []
for res in combo_query:
intent_dict = model_to_dict(res)
intent_dict['intent_tags'] = []
for intent_tags in res.intent_tags:
intent_tags_dict = model_to_dict(intent_tags)
intent_tags_dict['project_tags'] = []
for project_tags in intent_tags.tag.project_tags:
intent_tags_dict['project_tags'].append(model_to_dict(project_tags))
intent_dict['intent_tags'].append(intent_tags_dict)
result.append(intent_dict)
通过预取,我得到了2个查询;这并不完美,一个查询包含另一个查询作为子查询,因此它执行了2次,但是花费不太多,所以我可以接受...
但是在“ project_tags”循环中,每回合都要运行2个查询,以从project_tag
和project
获取数据,但是这些数据已经在第intent_tag_query
和{{ 1}}的:/
我希望我的问题很清楚,如果有用的话,我可以提供更多数据,我没有直接粘贴模型,因为我认为这可能破坏这篇文章的可读性,但是如果您愿意,我可以:)
谢谢!