Код: Выделить всё
class State(str, enum.Enum):
WATCHING = "WATCHING"
WATCHED = "WATCHED"
DROPPED = "DROPPED"
class Anime(Base):
__tablename__ = "anime"
uuid = Column(UUID, primary_key=True, default=uuid.uuid4)
name = Column(String(128), nullable=False, unique=True)
state = Column(Enum(State), default=State.WATCHING)
rate = Column(Integer, nullable=True)
review = Column(String(4096), nullable=True)
start_end = relationship(
"AnimeStartEnd",
back_populates="anime",
order_by="AnimeStartEnd.start_date",
lazy="joined"
)
class AnimeStartEnd(Base):
__tablename__ = "anime_start_end"
id = Column(Integer, primary_key=True)
start_date = Column(Date)
end_date = Column(Date, nullable=True)
anime_id = Column(UUID, ForeignKey("anime.uuid"))
anime = relationship("Anime", back_populates="start_end")
Код: Выделить всё
async def get_anime_list(session: AsyncSession, limit: int, page: int):
subq = (
select(models.AnimeStartEnd)
.order_by(models.AnimeStartEnd.start_date)
.subquery()
)
stmt = (
select(models.Anime)
.join(subq)
.options(joinedload(models.Anime.start_end))
.limit(limit)
.offset((page - 1) * limit)
)
result = await session.execute(stmt)
anime_list = result.scalars().unique().all()
return anime_list
Код: Выделить всё
[
{
"name": "string",
"state": "WATCHED",
"rate": 1,
"review": "string",
"start_end": [
{
"start_date": "2024-08-19",
"end_date": "2024-08-29"
},
{
"start_date": "2024-09-19",
"end_date": "2024-09-19"
}
],
"uuid": "string"
}
]
Код: Выделить всё
id start_date end_date anime_id | anime.name
9 2006-02-22 2016-09-12 6fe17741-527d-4537-b11f-7a0aa54b40fc | Naruto
20 2006-04-13 2007-08-22 8a2dfd03-e856-45de-80fc-2db8ad519555 | Shaman King
17 2016-09-13 2016-09-20 ba377637-8c3c-4a0d-9ea7-2ec50ad260e8 | ...
18 2017-05-23 2017-05-25 ba377637-8c3c-4a0d-9ea7-2ec50ad260e8 | ...
13 2020-01-01 2020-02-02 2ca9fa6c-197a-47dc-8b5b-61bf30fcfa0c | ...
Код: Выделить всё
[
{
"name": "Naruto",
"state": "WATCHED",
"rate": 10,
"review": "its been a long way",
"start_end": [
{
"start_date": "2006-02-22",
"end_date": "2016-09-12"
}
],
"uuid": "6fe17741-527d-4537-b11f-7a0aa54b40fc"
},
{
"name": "Shamag King",
"state": "WATCHED",
"rate": 9,
"review": "best opening",
"start_end": [
{
"start_date": "2006-04-13",
"end_date": "2007-08-22"
}
],
"uuid": "8a2dfd03-e856-45de-80fc-2db8ad519555"
},
{
"name": "Haikyuu!",
"state": "WATCHED",
"rate": 10,
"review": "best sport anime",
"start_end": [
{
"start_date": "2016-09-13",
"end_date": "2016-09-20"
},
{
"start_date": "2017-05-23",
"end_date": "2017-05-25"
},
{
"start_date": "2024-09-01",
"end_date": "2024-09-04"
}
],
"uuid": "ba377637-8c3c-4a0d-9ea7-2ec50ad260e8"
},
{
"name": "Testing transaction 2",
"state": "WATCHED",
"rate": 3,
"review": "not yet",
"start_end": [
{
"start_date": "2020-01-01",
"end_date": "2020-02-02"
},
{
"start_date": "2024-06-25",
"end_date": "2024-09-11"
}
],
"uuid": "2ca9fa6c-197a-47dc-8b5b-61bf30fcfa0c"
}
]
Подробнее здесь: https://stackoverflow.com/questions/790 ... -with-join