Вот модели:
class User(Base):
__tablename__ = 'users'
id = Column(CHAR, primary_key=True)
first_name = Column(CHAR)
last_name = Column(CHAR)
email = Column(CHAR)
receive_reports = Column(Boolean)
class MailPiece(Base):
__tablename__ = 'mail_pieces'
id = Column(CHAR, primary_key=True)
created_at = Column(DateTime)
template_id = Column(CHAR, ForeignKey('templates.id'))
class Template(Base):
__tablename__ = 'templates'
id = Column(CHAR, primary_key=True)
name = Column(CHAR)
created_by_id = Column(CHAR, ForeignKey('users.id'))
user = relationship(User, backref='templates')
Я хочу отправлять пользователям отчеты с: с какими шаблонами они отправлены и сколько почтовых отправлений было отправлено для каждого шаблона.
Я написалкод:
stmt = self.session.query(MailPiece.template_id, func.count('*')
.label('mail_pieces_count')).filter(
MailPiece.created_at > day_ago,
MailPiece.created_at < now,
).group_by(MailPiece.template_id).subquery()
query = self.session.query(Template, stmt.c.mail_pieces_count).\
filter(Template.user.has(receive_reports=True)).\
join(stmt, Template.id == stmt.c.template_id)
Но это немного не то, что я хотел.Я получил результат, сгруппированный по шаблонам, но мне нужен список, сгруппированный по пользователям, где у каждого пользователя будут шаблоны.Таким образом, я могу перебирать список пользователей и отправлять каждому пользователю отчет со сводкой.
Текущий результат:
[<Template(id='123', name='Test', mail_pieces_count='123', user=<User(id=1212, first_name='Some name', last_name='Some lastname')>)>, <Template(id='456', name='Test2', mail_pieces_count='456', user=<User(id=1212, first_name='Some name', last_name='Some lastname')>)>]
Ожидаемый результат:
[<User(id=1212, first_name='Some name', last_name='Some lastname, templates=[<Template(id='123', name='Test', mail_pieces_count='123')>, <Template(id='456', name='Test2', mail_pieces_count='456')>,])>]
Другими словами, теперь его можно представить так: Текущий:
templates = [
{
"id": 123,
"name": "Test",
"mail_pieces_count": 123,
"user": {
"id": 1212,
"first_name": "Some name",
"last_name": "Some lastname"
}
},
{
"id": 456,
"name": "Test2",
"mail_pieces_count": 456,
"user": {
"id": 1212,
"first_name": "Some name",
"last_name": "Some lastname"
}
}
]
Ожидаемый:
users = [
{
"id": 1212,
"first_name": "Some name",
"last_name": "Some lastname",
"templates": [
{
"id": 123,
"name": "Test",
"mail_pieces_count": 123
},
{
"id": 456,
"name": "Test2",
"mail_pieces_count": 456
},]
},
]