如何在Elixir或SQLAlchemy中为自己的多对一关系制作可自定义的“order by”?

时间:2012-02-01 22:00:42

标签: python orm sqlalchemy python-elixir

我们有实体节点:

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]
与他们的孩子相比,我们得到了相当有序的父亲。 (父亲[0] .children返回未排序的节点列表)

这个问题的几乎完美解决方案是添加" order_by"参数"儿童" Node中的字段。像这样:

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

现在我们的孩子们整理好了,但是...... 如果我们想要更改排序标准怎么办?有时我们希望按照" id"排序,有时候 - 按孩子或其他数量排序。现在我们以前的解决方案看起来并不那么好。

我们如何克服这个问题?

1 个答案:

答案 0 :(得分: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()