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 返回未排序的节点列表)

这个问题几乎完美的解决方案是在 Node.js 中的“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 回答