所以,我有一个类似的模型:
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_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_by
被附加到关系定义中指定的那个,而不是替换它;有没有办法让查询覆盖原始order_by
?我知道我可以直接在FooData
类上指定一个单独的查询,但如果可能的话我想避免这样做。
答案 0 :(得分:6)
通过传递
None
可以抑制所有现有的ORDER BY设置 - 这将抑制在映射器上配置的任何ORDER BY。
所以简单的解决方案是重置ORDER BY
子句然后应用你需要的子句。像:
self.data.order_by(None).order_by(asc("timestamp")).first()
如果您不想重置整个ORDER BY
子句,但只想覆盖一个列顺序,AFAIK就没有内置的方法。