Python 如何避免一个“错误”;N+;1“行为”;在Peewee中的树表查询中?

Python 如何避免一个“错误”;N+;1“行为”;在Peewee中的树表查询中?,python,peewee,Python,Peewee,我有一个由父链接外键表示的树数据结构,我希望每次都使用backref来执行一个新的查询 我使用的模型如下所示: from peewee import * class Table(Model): name = TextField() parent = ForeignKeyField('self', null=True, backref='children') Table.create_table() root = Table.create(name="root", paren

我有一个由父链接外键表示的树数据结构,我希望每次都使用backref来执行一个新的查询

我使用的模型如下所示:

from peewee import *

class Table(Model):
    name = TextField()
    parent = ForeignKeyField('self', null=True, backref='children')

Table.create_table()

root = Table.create(name="root", parent=None)
A1 = Table.create(name="A1", parent=root)
A2 = Table.create(name="A2", parent=root)
B1 = Table.create(name="B1", parent=A1)
我需要从某个元素得到一本包含所有子元素的字典

我试试这个:

query = Table.select().where(Table.name == "root")
tree = [model_to_dict(a, backrefs=True, recurse=True) for a in query]
我明白了:

[{
    'id': 1,
    'name': 'root',
    'parent': None,
    'children': [
        {'id': 2,'name': 'A1'},
        {'id': 3,'name': 'A2'}
    ]
}]
但它有两个问题:1)它只给我所有后代树的直系子代。2) 它多次访问数据库


有没有办法在没有N+1问题的情况下得到完整的子树?

您唯一的实际选择是使用递归公共表表达式。文档中有一个部分可能会有所帮助,因为它正好处理这种类型的查询:

查询示例还有一个递归CTE示例:


我已经试过了。但我还没有找到嵌套字典。我想我可以使用递归CTE获取所有子体,然后在嵌套字典中转换结果,但我认为Peewee可以用一种更优雅的方式从我身上实现这一点。数据库游标返回行元组。任何递归CTE仍然只会产生一个平面元组列表。数据库不是层次化的——它们是关系型的。任何层级转换都需要在您的终端完成。