当使用带有secondary-parameter(多对多)的relationship()时,如何在SQLAlchemy中使用order_by?

时间:2016-02-13 03:48:34

标签: python-3.x sqlalchemy

我在Person(作为作者)和Reference(作为科学出版物之间创建了多对多关系)。

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)

    _authors = sao.relationship('Person', secondary=ReferenceAuthor)


class Person(_Base):
    __tablename__ = 'Person'

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

我希望Reference().authorsReferenceAuthor.Index排序对象。

这里的三个表来自一个外来的sqlite3数据库。我无法更改该表的结构。我必须像他们一样对待他们。

我可以在order_by中找到关于relationship()的一些示例,但没有结合使用secondary=

我尝试了association_proxy并阅读了有关该文档的文档。

class ReferenceAuthor(_Base):
    __tablename__ = 'ReferenceAuthor'

    _reference_id = sa.Column('ReferenceID',  sa.Integer, sa.ForeignKey('Reference.ID'), primary_key=True)
    _person_id =  sa.Column('PersonID', sa.Integer, sa.ForeignKey('Person.ID'), primary_key=True)
    _index = sa.Column('Index', sa.Integer)

    _person = sao.relationship('Person')

class Reference(_Base):
    __tablename__ = 'Reference'

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

    _authors = saa.association_proxy('ReferenceAuthor', 'Person')

当我阅读文档时,我想我理解它背后的概念。但是使用我的代码它没有用,我不明白为什么。错误是

sqlalchemy.exc.InvalidRequestError: Mapper 'Mapper|Reference|Reference' has no property 'ReferenceAuthor'

1 个答案:

答案 0 :(得分:0)

解决方案1:

取决于@univerio的好评论答案:

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

解决方案2:

从sqla-mailinglist获得此提示。取决于我最初问题中的第一个代码:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/grid_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:numColumns="auto_fit"
    android:columnWidth="90dp"
    android:horizontalSpacing="10dp"
    android:verticalSpacing="10dp"
    android:gravity="center"
    android:stretchMode="columnWidth" >

</GridView>

这看起来很简单。

附带问题:这两种解决方案有什么区别?