2014-09-10 2 views
1

Учитывая эти отношения:Используя вложенное значение для отношений SQLAlchemy order_by

A.children = [B...] 
B.type = C 
C.order = int 

Как я могу определить порядок .children отношения к порядку B.type.order?

class A(Base): 
    id  = Column(Integer, primary_key=True) 
    children = relationship(lambda: B, order_by=lambda: B.type.order) 
    #           ^^^^^^^^^^^^^^^^^^^^ 
    #           this doesn't work 

class B(Base): 
    C_id = Column(Integer, ForeignKey(C.id), primary_key=True) 
    A_id = Column(Integer, ForeignKey(A.id), primary_key=True) 

    type = relationship(lambda: C) 

class C(Base): 
    id  = Column(Integer, primary_key=True) 
    order = Column(Integer) 

дает мне:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with B.type has an attribute 'order'

+0

[Это] (http://stackoverflow.com/q/9861990/102441) кажется релевантно, но я не уверен, как вписаться в 'order_by' kwarg – Eric

+0

. Ваш' B.type' - это отношения, у него нет атрибута заказа. Order_by необходимо разрешить для столбца таблицы ** B **. То, что вы пытаетесь сделать, - это даже не столбец B, но для таблицы C требуется JOIN, и я не думаю, что это можно сделать. Возможно, посмотрите на это http://docs.sqlalchemy.org/en/latest/orm/mapper_config.html#using-column-property. – dtheodor

+0

Другим обходным путем было бы объявить ваши отношения как «lazy =» dynamic », а затем сделать' a.children.join (C) .order_by (C.order) .all() ' – dtheodor

ответ

0

Это выглядит, как он должен работать:

class A(Base): 
    id  = Column(Integer, primary_key=True) 
    children = relationship(lambda: B, order_by=lambda: B._order) 

class B(Base): 
    C_id = Column(Integer, ForeignKey(C.id), primary_key=True) 
    A_id = Column(Integer, ForeignKey(A.id), primary_key=True) 

    type = relationship(lambda: C) 
    _order = column_property(select([C.order]).where(C.id == C_id)) 

class C(Base): 
    id  = Column(Integer, primary_key=True) 
    order = Column(Integer) 
Смежные вопросы