Python SQLAlchemy:Override relationship defined";订购人;在查询中

Python SQLAlchemy:Override relationship defined";订购人;在查询中,python,sqlalchemy,Python,Sqlalchemy,因此,我有一个模型,类似于: class Foo(model): __tablename__ = "foo" id = Column(Integer, primary_key=True) data = relationship( "FooData", cascade="all, delete-orphan", backref="foo", lazy="dynamic", order_by="d

因此,我有一个模型,类似于:

class Foo(model):
    __tablename__ = "foo"
    id = Column(Integer, primary_key=True)
    data = relationship(
        "FooData",
        cascade="all, delete-orphan",
        backref="foo",
        lazy="dynamic",
        order_by="desc(FooData.timestamp)"
    )

    @property
    def first_item(self):
        # the problem is here:
        return self.data.order_by(asc("timestamp")).first()

    @property
    def latest_item(self):
        return self.data.first()


class FooData(Model):
    __tablename__ = "foo_data"
    foo_id = Column(Integer, ForeignKey("foo.id"), primary_key=True)
    timestamp = Column(DateTime, primary_key=True)
    actual_data = Column(Float, nullable=False)
因此,这里的
first\u item
方法存在问题:如上所述定义时,SQL如下所示:

SELECT foo_data.timestamp AS foo_data_timestamp, foo_data.actual_data AS foo_data_actual_data, foo_data.foo_id AS foo_data_foo_id 
FROM foo_data 
WHERE :param_1 = foo_data.foo_id ORDER BY foo_data.timestamp DESC, foo_data.timestamp ASC
--                                                                 ^^^^^^^^^^^^^^^^^^^^^^
显然,查询中指定的
order\u by
将附加到关系定义中指定的,而不是替换它;查询是否有办法通过覆盖原始的
订单?我知道我可以直接在
FooData
类上指定一个单独的查询,但如果可能的话,我希望避免这种情况。

根据:

通过传递
None
,可以抑制所有现有的顺序设置-这也将通过在映射器上配置来抑制任何顺序

因此,简单的解决方案是重置
ORDER BY
子句,然后应用所需的。比如:

self.data.order_by(None).order_by(asc("timestamp")).first()

如果您不想重置整个
ORDER BY
子句,而只想覆盖一列顺序,那么就没有内置的方法了。

谢谢,这样做了!我注意到其他答案中提到了这项技术,但我从未想到在这里使用它。