repo user with loads filters
This commit is contained in:
@@ -23,6 +23,7 @@ ___
|
|||||||
- 🔥 Установка приоритетов и дедлайнов
|
- 🔥 Установка приоритетов и дедлайнов
|
||||||
- 🔔 Напоминания и уведомления
|
- 🔔 Напоминания и уведомления
|
||||||
- ⚙️ Асинхронная обработка задач
|
- ⚙️ Асинхронная обработка задач
|
||||||
|
- 📄 Пагинация и фильтрация задач с поддержкой limit/offset
|
||||||
- 💡 Современный и интуитивно понятный интерфейс
|
- 💡 Современный и интуитивно понятный интерфейс
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ ___
|
|||||||
- `GET /users` — Получить список всех пользователей
|
- `GET /users` — Получить список всех пользователей
|
||||||
- `GET /users/{user_id}` — Получить конкретного пользователя
|
- `GET /users/{user_id}` — Получить конкретного пользователя
|
||||||
- `GET /users/{user_id}/tasks` — Получить задачи пользователя
|
- `GET /users/{user_id}/tasks` — Получить задачи пользователя
|
||||||
|
- **Query параметры:**
|
||||||
|
- `limit` (int, опционально) — Максимальное количество задач для возврата
|
||||||
|
- `offset` (int, опционально, по умолчанию 0) — Количество задач для пропуска
|
||||||
|
- **Пример:** `GET /users/1/tasks?limit=10&offset=20`
|
||||||
- `POST /users` — Создать нового пользователя
|
- `POST /users` — Создать нового пользователя
|
||||||
- `PUT /users/{user_id}` — Обновить данные пользователя
|
- `PUT /users/{user_id}` — Обновить данные пользователя
|
||||||
- `PATCH /users/{user_id}` — Частично обновить данные пользователя
|
- `PATCH /users/{user_id}` — Частично обновить данные пользователя
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
from typing import Optional
|
||||||
|
|
||||||
from sqlalchemy import select, update
|
from sqlalchemy import select, update
|
||||||
from sqlalchemy.orm import selectinload
|
from sqlalchemy.orm import selectinload
|
||||||
|
|
||||||
@@ -20,16 +22,34 @@ class UsersRepo(BaseRepo):
|
|||||||
model = result.scalar_one()
|
model = result.scalar_one()
|
||||||
return model
|
return model
|
||||||
|
|
||||||
async def get_one_with_load(self, user_id: int) -> UsersORM | None:
|
async def get_one_with_load(
|
||||||
quary = (
|
self,
|
||||||
|
user_id: int,
|
||||||
|
tasks_limit: Optional[int] = None,
|
||||||
|
tasks_offset: int = 0
|
||||||
|
) -> UsersORM | None:
|
||||||
|
tasks_subquery = (
|
||||||
|
select(TasksORM.id)
|
||||||
|
.where(TasksORM.user_id == user_id)
|
||||||
|
)
|
||||||
|
|
||||||
|
if tasks_limit is not None:
|
||||||
|
tasks_subquery = tasks_subquery.limit(tasks_limit)
|
||||||
|
if tasks_offset > 0:
|
||||||
|
tasks_subquery = tasks_subquery.offset(tasks_offset)
|
||||||
|
|
||||||
|
query = (
|
||||||
select(self.model)
|
select(self.model)
|
||||||
.where(self.model.id == user_id)
|
.where(self.model.id == user_id)
|
||||||
.options(
|
.options(
|
||||||
selectinload(self.model.tasks).load_only(
|
selectinload(
|
||||||
|
self.model.tasks.and_(TasksORM.id.in_(tasks_subquery))
|
||||||
|
).load_only(
|
||||||
TasksORM.id, TasksORM.title, TasksORM.due_date, TasksORM.priority
|
TasksORM.id, TasksORM.title, TasksORM.due_date, TasksORM.priority
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
)
|
)
|
||||||
result = await self.session.execute(quary)
|
result = await self.session.execute(query)
|
||||||
obj = result.scalar_one_or_none()
|
obj = result.scalar_one_or_none()
|
||||||
return obj
|
return obj
|
||||||
|
|||||||
Reference in New Issue
Block a user