我有一个查询,返回一个User对象。User拥有许多Post已制造的。执行查询时,我想User.post根据特定时间过滤发现的帖子。例如,仅返回给定时间戳记1天内的帖子。
User
Post
User.post
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加载的子级。
加载自定义过滤收集使用完成contains_eager()。由于目标是User即使所有对象都没有Post符合过滤条件的对象,也要加载它们,因此outerjoin()应使用an ,并将谓词的谓词放在ON连接的子句中:
contains_eager()
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))