2016-03-20 6 views
1

Referenceという特定のオブジェクトを照会したい。しかし、私はそのリストをその子オブジェクト(あなたは関係を言うことができる)の順番にしたい:Reference._periodical._nameReference._author._lastname' (means the __first__ author, which are orded by ReferenceAuthor.Index`)。SQLAlchemyの子オブジェクトのフィールドによる順序?

これを行う方法がわかりません。これは問合せですが、順序付けはありません。

return self.session.query(Reference) \ 
     .filter_by(_mark = False) \ 
     #.order_by(Reference._periodical) \ 
     #.order_by(Reference._author._lastname) \ 
     .all() 

これは私の知る限りでは、あなたがそのようSQLAlchemyの使用することはできませんモデル自体

ReferenceAuthor = sa.Table('ReferenceAuthor', _Base.metadata, 
     sa.Column('ReferenceID', sa.Integer, sa.ForeignKey('Reference.ID'), primary_key=True), 
     sa.Column('PersonID', sa.Integer, sa.ForeignKey('Person.ID'), primary_key=True), 
     sa.Column('Index', sa.Integer) 
     ) 


class Reference(_Base): 
    __tablename__ = 'Reference' 

    _id = sa.Column('ID', sa.Integer, primary_key=True) 
    _mark = sa.Column('HasLabel', sa.Boolean) 

    # Autor 
    _authors = sao.relationship('Person', secondary=ReferenceAuthor, 
      order_by=ReferenceAuthor.c.Index) 

    # Journal 
    _periodical_fk = sa.Column('PeriodicalID', 
           sa.Integer, 
           sa.ForeignKey('Periodical.ID')) 
    _periodical = sao.relationship('Periodical') 


class Periodical(_Base): 
    __tablename__ = 'Periodical' 

    _id = sa.Column('ID', sa.Integer, primary_key=True) 
    _name = sa.Column('Name', sa.String) 


class Person(_Base): 
    __tablename__ = 'Person' 

    _id = sa.Column('ID', sa.Integer, primary_key=True) 
    _lastname = sa.Column('LastName', sa.String) 

答えて

1

です。関係は、参照のインスタンスに対してのみ機能します。これを行う1つの方法はcolumn propertiesまたはhybrid attributesですが、私が見つけた最も明白な方法は、結合してから並べ替えることです。これは、次のSQLコードになり

stmnt = session.query(Reference) \ 
     .join(Periodical) \ 
     .order_by(Periodical._name) \ 
     .filter(Reference._mark == False) 

print(stmnt) 

:あなたは人の作者が含まれるようにそれを拡張したい場合は、あなたのコメントに続い

SELECT "Reference"."ID" AS "Reference_ID", "Reference"."HasLabel" AS "Reference_HasLabel", "Reference"."PeriodicalID" AS "Reference_PeriodicalID" 
FROM "Reference" JOIN "Periodical" ON "Periodical"."ID" = "Reference"."PeriodicalID" 
WHERE "Reference"."HasLabel" = 0 ORDER BY "Periodical"."Name" 

あなたはこのような何かを必要とする次のようにこれを行う方法です:

stmnt = session.query(Reference).\ 
    filter_by(_mark=False).\ 
    join(Periodical).\ 
    join(ReferenceAuthor, and_(ReferenceAuthor.c.ReferenceId == Reference.ID), ReferenceAuthor.c.Index == 0)).\ 
    join(Person).\ 
    order_by(Periodical._name).\ 
    order_by(Person._lastname) 
+0

非常に良い。しかし、これは 'Authors'のために実際には機能しません。まず、 'Periodical._name'で注文したいと思います。そしてセカンダリ参照は 'Reference._authors [0] ._ lastname'によって順序付けされるべきです。 – buhtz

+0

'session.query(参照).filter_by(_mark = False).join(定期的).join(ReferenceAuthor).join(Person).order_by(Periodical._name).order_by(Person._lastname)'は機能しません。 – buhtz

+0

私は少し質問を指定しました。私は__first__作者の姓によってのみ注文したいと思います。あなたの解決策(私はそれを確認した)すべての作者による注文 - 私は非常にinteresetingを発見した。 – buhtz

関連する問題