首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy:背景色上的Order_by

SQLAlchemy:背景色上的Order_by
EN

Stack Overflow用户
提问于 2014-09-20 12:55:55
回答 1查看 6.6K关注 0票数 5

我有两张桌子:

代码语言:javascript
复制
Products
========================================
   ID          Name            Desc
--------|----------------|--------------
        |                |
        |                |

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

这两个表通过关系连接:

代码语言:javascript
复制
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给我与该产品相关的研究,这样的研究是按年排序的(最近的第一次)。下列任何一项工作均未完成:

代码语言:javascript
复制
 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()))

怎样才是正确的方法?除了身份证之外,我还没有找到很多关于订购的信息。

EN

回答 1

Stack Overflow用户

发布于 2017-09-03 03:02:08

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

将关系添加到主表,而不是关联表。另外,如果显式地将关系添加到每个表中,则不需要使用backref

代码语言:javascript
复制
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可以在这里工作。)

对很多人来说,我都是这样做的,因为我无论如何都在定义这两种关系。对于一对多的用户,您还可以将其放在后台引用中,如下所示(不要忘记从sqlalchemy.orm导入sqlalchemy.orm)。下面的示例假设每项研究只能作为一种产品的证据,但每一种产品都可能得到多项研究的支持。

代码语言:javascript
复制
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()'))
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25948991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档