我有两张桌子:

Products
========================================
   ID          Name            Desc
--------|----------------|--------------
        |                |
        |                |

Studies
========================================
   ID          Title           Year
--------|----------------|--------------
        |                |
        |                |

这两个表通过关系连接:
products_studies_association = Table('products_studies', Base.metadata,
Column('product_id', Integer, ForeignKey('products.id')),
Column('study_id', Integer, ForeignKey('studies.id')))

studies = relationship('Study', secondary=products_studies_association, backref='products')

我希望product.studies给我提供与该产品相关的研究,以便这些研究按年排序(最近的第一次)。以下工作都不起作用:
 studies = relationship('Study', secondary=products_studies_association, backref='products', order_by=Study.year.desc())
 studies = relationship('Study', secondary=products_studies_association, backref=backref('products', order_by=Study.year.desc()))

做这件事的正确方法是什么?除了身份证,我找不到任何订购信息。

最佳答案

我知道这是旧的,但我偶然发现它在搜索一些略有不同但仍然适用的东西,所以也许有人会发现它有用。
将关系添加到主表,而不是关联表。另外,如果显式地将关系添加到每个表中,则不需要使用backref

class Product(Base):
    __tablename__ = 'products'
    id = Column(Integer, primary_key=True)
    name = Column(Text)
    desc = Column(Text)

    studies = relationship('Study', secondary='products_studies', order_by='Study.year.desc()')

class Study(Base):
    __tablename__ = 'studies'
    id = Column(Integer, primary_key=True)
    title = Column(Text)
    year = Column(String(4))

    products = relationship('Product', secondary='products_studies')

class ProductStudyAssoc(Base):
    __tablename__ = 'products_studies'
    study_id = Column(Integer, ForeignKey('studies.id'), primary_key=True)
    product_id = Column(Integer, ForeignKey('products.id'), primary_key=True)

如图所示,我将relationship(order_by='Study.year.desc()')放入引号中。当在引用之前定义表时,unquoted有时可能会起作用,但quoted应该始终起作用。如果您希望它是升序的,那么这是默认值,这样您就可以省略.desc()。(我使用String(4)只显示一个选项;文本或整数可以在这里工作。)
对很多人来说,我是这么做的,因为我定义了两种关系对于一对多,您也可以将其放在backref中,如下所示(不要忘记从backref导入sqlalchemy.orm)。以下示例假设每个研究将仅作为一个产品的证据,但每个产品可能由多个研究支持。
class Product(Base):
    __tablename__ = 'products'
    id = Column(Integer, primary_key=True)
    name = Column(Text)
    desc = Column(Text)

class Study(Base):
    __tablename__ = 'studies'
    id = Column(Integer, primary_key=True)
    title = Column(Text)
    year = Column(String(4))

    product_id = Column(Integer, ForeignKey('products.id'))
    product = relationship('Product', backref=backref('studies', order_by='Study.year.desc()'))

09-28 08:44