【问题标题】:SQLAlchemy: Order_by on backrefSQLAlchemy:反向引用上的 Order_by
【发布时间】:2017-09-03 11:02:08
【问题描述】:

我有 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 之外,我找不到太多关于按任何东西订购的信息。

【问题讨论】:

  • 你把studies放在哪里了?在class Product 下还是在class Studies 下?也请尝试tudies = relationship('Study', secondary=lambda: products_studies_association)

标签: python sqlalchemy


【解决方案1】:

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

将关系添加到主表,而不是关联表。另外,如果显式添加关系到每个表,则不需要使用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) 只是为了显示一个选项;文本或整数可以在这里工作。)

对于多对多,我按照上面的方法进行操作,因为无论如何我都在定义这两种关系。对于一对多,您也可以将其放在您的 backref 中,如下所示(不要忘记从 sqlalchemy.orm 导入 backref)。以下示例假设每项研究仅作为一种产品的证据,但每种产品可能得到多项研究的支持。

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

【讨论】:

    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多