【发布时间】:2019-02-07 01:39:23
【问题描述】:
我有一个由父链接外键表示的树数据结构,我想使用 backref 避免 Peewee 每次都执行新查询。
我使用的模型是这样的:
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 问题http://docs.peewee-orm.com/en/latest/peewee/relationships.html#nplusone?
【问题讨论】: