SQLAlchemy: как применить отличительный перед фильтром в запросе соединения - PullRequest
0 голосов
/ 28 апреля 2020

Есть ли способ применить отличные перед фильтрацией в запросе на соединение?

У меня есть 2 таблицы:

class User(db.Model):
  id = db.Column(db.Integer(), primary_key=True)

class Event(db.Model):
  id = db.Column(db.Integer(), primary_key=True)
  date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
  description = db.Column(db.String(80))
  user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
  user = db.relationship('User', backref=db.backref('events', lazy=True))

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

Я думал, что это сработает:

User.query.join('events').order_by(Event.date).distinct(User.id).filter(Event.description==None)

Однако, кажется, что после фильтра вызывается отличный. Есть ли способ заставить применить отличные перед фильтрацией?

1 Ответ

0 голосов
/ 29 апреля 2020

DISTINCT используется для возврата различных значений.

В этом случае вам нужен подзапрос для создания таблицы, используя GROUP BY , где вы группируете Event по user_id и вычисляете самое последнее событие:

last_events = db.session.query(
                    Event.user_id, 
                    db.func.max(Event.date).label('last_event_date'),
                    Event.description)\
                        .group_by(Event.user_id)
                        .subquery()

Затем вы можете присоединиться к этой таблице к User и выполнить фильтрацию по описанию last_event_:

User.query.join(last_events,User.id==last_events.c.bac_id)
            .filter(last_events.c.description==None)

Et voilà!

.c происходит от того, как вы обращаетесь к столбцам подзапроса в SQLAlchemy.

...