SQLAlchemy - правильный способ «двойных запросов» - PullRequest
0 голосов
/ 11 сентября 2018

пожалуйста, какой правильный путь для этой простой модели?

У меня есть две модели: Тема и Отчет:

class User(UserMixin, Model):
    __tablename__ = 'users'
    id = Column(db.Integer, primary_key=True)
    email = Column(db.String(60), unique=False, nullable=True)
    ...
    reports = db.relationship('Report', backref='user', lazy='dynamic')

class Report(UserMixin, Model):
    __tablename__ = 'reports'
    ...
    created_at = Column(db.DateTime, default=dt.datetime.now)
    user_id = Column(db.Integer, db.ForeignKey('users.id'))

и мне нужен список всех пользователей с датой последнего отчета.

Грязным способом является:

subjects = User.query.all()
for s in subjects:
    report_date = Report.query.filter(Report.subject_id == s.id).order_by(Report.id.desc()).first()
    print('Subject + Report', s.email, report_date)

Пожалуйста, как создать этот список чистым способом?

(например, объединение таблиц и запросов, временная таблица с идентификаторами субъектов + дата)последнего посещения, сохраните дату последнего посещения непосредственно в таблице Тема ...)

Спасибо.

1 Ответ

0 голосов
/ 11 сентября 2018

Я не уверен в том, что вам действительно нужно, но если это для доступа к последнему отчету друг для друга в списке, вам просто нужно сделать:

last_report = user.reports.order_by(Report.created_at.desc()).first()

Возможно, у вас есть свойство или гибридное_справство для вашей модели пользователя:

@property
def last_report(self):
    return user.reports.order_by(Report.created_at.desc()).first()

@property
def last_report_date(self):
    return self.last_report.created_at

И чтобы получить список кортежей, содержащих электронную почту и report_date, вы можете сделать это:

db.session.query(User.email, func.max(Product.created)).join(Report).group_by(Provider.email).all()

В любом случае, если у вас много записей и вы хотите показать этот список пользователям сети, вам следует подумать об использовании нумерации страниц. Flask-sqlalchemy предоставляет простой способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...