sqlalchemy фильтр дочерних в запросе, но не родительский - PullRequest
1 голос
/ 10 апреля 2019

У меня есть запрос, который возвращает объект 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)

Важно отметить, что я не хочу отфильтровывать родителей, если нет детей, которые соответствуют критериям.Я только хочу отфильтровать потомков, загруженных по орме, для заданных пользователей.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Загрузка пользовательских отфильтрованных коллекций выполняется с помощью 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))
0 голосов
/ 10 апреля 2019

Я не уверен, что это то, что вы ищете, но что не так с этим подходом KISS?

Post.query.filter(Post.user == <username>).filter(
    Post.time > START_OF_DAY).filter(Post.time < END_OF_DAY).all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...