我有2张桌子:
Products
========================================
ID Name Desc
--------|----------------|--------------
| |
| |
Studies
========================================
ID Title Year
--------|----------------|--------------
| |
| |
Run Code Online (Sandbox Code Playgroud)
这两个表通过关系连接:
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')
Run Code Online (Sandbox Code Playgroud)
我想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()))
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?除了 id 之外,我找不到太多关于按任何东西订购的信息。
小智 7
我知道这是旧的,但我在搜索稍微不同但仍然适用的东西时偶然发现了它,所以也许有人会发现它有用。
将关系添加到主表,而不是关联表。此外,如果您将关系显式添加到每个表,则不需要使用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)
Run Code Online (Sandbox Code Playgroud)
relationship(order_by='Study.year.desc()')如图所示,我加了引号。在引用之前定义表时,未引用有时可能会起作用,但引用应该始终有效。如果您希望它升序,这是默认设置,因此您可以省略.desc(). (我曾经String(4)只显示一个选项;Text 或 Integer 可以在这里工作。)
对于多对多,我按照上面的方式进行操作,因为无论如何我都在定义这两种关系。对于一个一对多的,你也可以把它放在你的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()'))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4728 次 |
| 最近记录: |