Peewee,如何避免具有多对多关系的n + 1个查询

时间:2019-02-21 15:01:55

标签: python-3.x peewee

我有一个具有多对多关系的模型(涉及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_tagproject获取数据,但是这些数据已经在第intent_tag_query和{{ 1}}的:/

我希望我的问题很清楚,如果有用的话,我可以提供更多数据,我没有直接粘贴模型,因为我认为这可能破坏这篇文章的可读性,但是如果您愿意,我可以:)

谢谢!

0 个答案:

没有答案