小编典典

sqlalchemy筛选查询中的子级,但不是父级

sql

我有一个查询,返回一个User对象。User拥有许多Post已制造的。执行查询时,我想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加载的子级。


阅读 257

收藏
2021-04-14

共1个答案

小编典典

加载自定义过滤收集使用完成contains_eager()。由于目标是User即使所有对象都没有Post符合过滤条件的对象,也要加载它们,因此outerjoin()应使用an
,并将谓词的谓词放在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))
2021-04-14