Можно ли отфильтровать содержимое отношений при опросе родительской модели?

У меня две модели, представляющие фильмы и их шоу. Я хотел бы запросить все фильмы, но их отношения show_times должны содержать только те шоу-шоу, которые есть в будущем.

 class PKMovie(db.Model): id = db.Column(db.Integer, primary_key=True) url = db.Column(db.String(255)) show_times = db.relationship('ShowTime') class ShowTime(db.Model): id = db.Column(db.Integer, primary_key=True) date = db.Column(db.Date) pk_movie_id = db.Column(db.Integer, db.ForeignKey('pk_movie.id')) 

Возможно ли повлиять на содержимое отношения при запросе родителя?

One Solution collect form web for “Можно ли отфильтровать содержимое отношений при опросе родительской модели?”

Отношение по умолчанию является простым выражением равенства: Parent.id == ForeignKey.id . Вы не можете изменить содержимое отношений во время запроса *, но вы можете создать другое отношение, которое выбирает только те элементы, которые вы хотите.

 class PKMovie(db.Model): # ... future_show_times = db.relationship( lambda: ShowTime, primaryjoin=lambda: db.and_( PKMovie.id == ShowTime.pk_movie_id, ShowTime.date >= db.func.current_timestamp() ), viewonly=True ) 

Доступ к экземпляру future_show_times будет возвращать только время показа, которое будет в будущем. Вы можете запросить загрузку этих отношений во время запроса, чтобы при обращении к нему не требовался дополнительный запрос к базе данных.

 PKMovie.query.options(db.joinedload(PKMovie.future_show_times)).all() 

См. Документацию по отношениям .


* Технически вы можете изменить отношения во время запроса, как показано в этом ответе . Однако я думаю, что гораздо яснее определить эти другие отношения.

  • sqlalchemy: остановка долгосрочного запроса
  • sqlalchemy кэширование некоторых запросов
  • как заставить SQLlite выбрать для поведения транзакции обновления в sqlalchemy
  • datetime в определении базы данных с использованием sqlalchemy
  • Почему методы сеанса несвязаны в sqlalchemy с использованием sqlite?
  • Flask-SQLAlchemy объединяются в 3 модели и конструкцию таблицы
  • Как построить отношения «многие ко многим» с помощью SQLAlchemy: хороший пример
  • Как вернуть количество связанных объектов в запросе sqlalchemy
  • Python - лучший язык программирования в мире.