繁体   English   中英

SQLAlchemy:backref上的Order_by

[英]SQLAlchemy: Order_by on backref

我有2张桌子:

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()))

这样做的正确方法是什么? 除了id之外,我还没有找到关于订购的更多信息。

我知道这是旧的,但我偶然发现它在寻找稍微不同但仍然适用的东西时,所以也许有人会发现它很有用。

将关系添加到主表,而不是关联表。 此外,如果您明确地将关系添加到每个表,则不需要使用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()')放在引号中,如图所示。 在引用之前定义表时,有时可以使用不带引号,但引用应始终有效。 如果您希望它是升序,那么这是默认值,因此您可以省略.desc() (我只使用String(4)来显示一个选项; Text或Integer可以在这里工作。)

对于多对多,我按上述方式执行,因为无论如何我都要定义这两种关系。 对于一个一对多的,你也可以把它放在你的backref如下(不要忘记导入backrefsqlalchemy.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()'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM