2012-02-01 30 views
0

我們有實體節點:如何在Elixir或SQLAlchemy中進行可自定義的「order by」與自身的多對一關係?

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中的「children」字段。事情是這樣的:

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

而現在我們的孩子進行排序,一切都很好,但是...... 如果我們想改變標準排序?有時我們希望通過「id」進行排序,有時候需要按照孩子的數量或其他方式進行排序。現在我們以前的解決方案看起來不太好。

我們該如何克服這個問題?

回答

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() 
+0

Thx。我還沒有找到更好的。 – Andrew 2012-02-02 18:29:52

相關問題