0

エンティティノードがあります:

class Node(Entity):
    parent = ManyToOne('Node')
    children = OneToMany('Node')

次のようにクエリすると:

nodes = (
    Node.query
    .options(
        eagerload(Node.children),
    )
    .order_by(desc(Node.id))
    .all()
)

fathers = [n for n in nodes if n.parent == None]

子供たちとは対照的に、かなり秩序立った父親がいます。(fathers[0].children はソートされていないノードのリストを返します)

この問題のほぼ完璧な解決策は、ノードの「children」フィールドに「order_by」パラメーターを追加することです。このようなもの:

class Node(Entity):
    parent = ManyToOne('Node')
    children = OneToMany('Node', order_by='-id')

これで、子供たちは並べ替えられ、すべて問題ありませんが... 並べ替えの基準を変更したい場合はどうすればよいでしょうか? 「id」でソートしたい場合もあれば、子の数などでソートしたい場合もあります。さて、以前のソリューションはあまり良くありません。

どうすればこれを克服できますか?

4

1 に答える 1

0

このElixir構文が何であるかはわかりませんが、SQLAlchemyを使用して純粋に行うことは次のとおりです。デフォルトのメソッドではなく、子を呼び出す関数を作成します。

class Node(...):
    def get_children(self, order='new'):
        if order == 'new':
            orderby = Node.created.desc()
        elif order == 'old':
            orderby = Node.created.asc()
        return DBSession.query(Node).filter(Node.parent_id == self.id).order_by(orderby).all()
于 2012-02-02T06:25:09.570 に答える