Python 按子对象排序';什么是炼金术领域?

Python 按子对象排序';什么是炼金术领域?,python,sqlalchemy,Python,Sqlalchemy,我想查询参考的特定对象。但我希望该列表按其子对象排序(可以说是关系):Reference.\u journal.\u name和Reference.\u author.\u lastname'(表示第一作者,由ReferenceAuthor.Index`排序) 看不出怎么做。这是查询,但其中没有排序 return self.session.query(Reference) \ .filter_by(_mark = False) \ #.order_by(Ref

我想查询
参考
的特定对象。但我希望该列表按其子对象排序(可以说是关系):
Reference.\u journal.\u name
Reference.\u author.\u lastname'(表示第一作者,由
ReferenceAuthor.Index`排序)

看不出怎么做。这是查询,但其中没有排序

return self.session.query(Reference) \
         .filter_by(_mark = False) \
         #.order_by(Reference._periodical) \
         #.order_by(Reference._author._lastname) \
         .all()
这就是模型本身

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)

据我所知,你不能那样使用SQLAlchemy。这些关系仅适用于引用实例。一种方法是通过
列属性
混合属性
,但我发现最清晰的方法是先进行连接,然后进行排序。方法如下:

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

print(stmnt)
这将产生以下sql代码:

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)

很不错的。但这对
作者来说并不真正有效。首先我想按
期刊订购。_name
-有效。其次,引用应按
Reference.\u authors[0]。\u lastname
session.query(Reference)。filter by(\u mark=False)。join(期刊)。join(引用作者)。join(个人)。order(期刊.\u name)。order(个人.\u lastname)
不起作用。我稍微指定了我的问题。我只想按第一作者的姓订购。你的解决方案(我检查过)按所有作者的顺序排列——我发现这非常有趣。看起来查询本身“忽略”了
关系(…,order\u by=ReferenceAuthor.c.Index)
我在
Reference上指定的。\u authors
)我尝试了
join(ReferenceAuthor,ReferenceAuthor.Index=0)
。但是
Index
在这里不存在。在sqla邮件列表的帮助下,我如何处理
ReferenceAuthor
中的第三列
join(ReferenceAuthor,和u(ReferenceAuthor.c.ReferenceId==Reference.ID),ReferenceAuthor.c.Index==0))
a请将此添加到您的答案中。我不想为自己打开一个答案,因为我没有获得代表积分!;)