Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:Order_by on backref_Python_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy:Order_by on backref

Python SQLAlchemy:Order_by on backref,python,sqlalchemy,Python,Sqlalchemy,我有两张桌子: Products ======================================== ID Name Desc --------|----------------|-------------- | | | | Studies ======================================== ID

我有两张桌子:

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)
我将
关系(order_by='Study.year.desc()')
放在引号中,如图所示。当表在引用之前定义时,Unquoted有时可能会起作用,但quoted应该始终起作用。如果希望它是升序的,这是默认值,因此可以省略
.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()'))

请提供
产品研究协会
的信息。当然,我已经为
产品研究协会
添加了行。您将
研究
放在哪里?在
课程产品下
课程研究下
?另外,请尝试
tudies=relationship('Study',secondary=lambda:products\u studies\u association)
您尝试过这个吗?