我有一个返回User
对象的查询。 User
s有一些他们制作的Post
s。当我执行查询时,我想根据特定时间过滤User.post
中找到的帖子。例如,仅在给定时间戳的1天内返回帖子。
class User(base):
__tablename__ = 'User'
class Post(base):
__tablename__ = 'Post'
user_id = Column(Integer, ForeignKey('User.uid'))
user = relationship(User, backref=backref('post')
time = Column(DateTime, default=func.current_timestamp())
有没有办法动态更改orm加载子项的方式,并在查询时指定它?像(伪代码)的东西:
User.query.filter_child(Post.time in timespan)
重要的是,如果没有符合条件的孩子,我不想过滤掉父母。我只想过滤给定用户的orm加载的子项。
Loading custom filtered collections使用contains_eager()
完成。由于目标是加载所有User
对象,即使它们没有与过滤条件匹配的Post
对象,也应该使用outerjoin()
,并在连接的ON
子句中放置帖子的谓词:
end = datetime(2019, 4, 10, 12, 0)
start = end - timedelta(days=1)
# If you want to use half closed intervals, replace `between` with
# suitable relational comparisons.
User.query.\
outerjoin(Post, and_(Post.user_id == User.uid,
Post.time.between(start, end))).\
options(contains_eager(User.post))
我不确定这是你在寻找什么,但这种KISS方法有什么问题?
Post.query.filter(Post.user == <username>).filter(
Post.time > START_OF_DAY).filter(Post.time < END_OF_DAY).all()