Можно ли указывать моделям pydant'ика параметры, используя paginate?

Рейтинг: 0Ответов: 0Опубликовано: 23.01.2023

У меня есть простая функция, которая должна выдавать пользователям несколько новостей:

@router.get('/all', response_model=LimitOffsetPage[NewsRead])
async def get_all_news(limit: int = Query(default=50, lt=101, gt=0),
                       offset: int = Query(default=0, gt=-1),
                       session: AsyncSession = Depends(get_async_session)):
    params = LimitOffsetParams(limit=limit, offset=offset)
    request = select(News).options(
        selectinload(News.comments),
        selectinload(News.author),
        selectinload(News.comments, Comment.author),
    ).order_by(desc(News.created_at))

    return await paginate(session, request, params=params)

где NewsRead - это модель pydantic'а

class NewsRead(BaseModel):
    id: int

    title: str
    context: str

    rating_value: int

    author: UserShortRead
    comments: List[CommentShortRead]

    created_at: datetime.datetime
    updated_at: datetime.datetime

    file: Optional[FileRead]

    class Config:
        orm_mode = True

Дело в том, что параметра rating_value я высчитывал и добавлял. Например:

news.rating_value = await get_news_rating(session=session, news=news)

Аналогично я поступаю, для передачи контента файла. Сначала создаю экземпляр класса pydantic'а FileRead, заполняю его, а потом передаю, как параметр объекта, который в будущем будет передан в NewsRead.from_orm(some_object)

Например:

if news.filepath:
    try:
        with open(news.filepath, 'rb') as file_content:
            file = FileRead(filetype=get_settings().IMAGE_CONTROLLER.file_format,
                            content=base64.b64encode(file_content.read()))

        news.file = file
    except FileNotFoundError:
        raise HTTPException(500, detail='server miss news files')
return NewsRead.from_orm(news)

Однако, когда я хочу использовать pagination и делаю так:

@router.get('/all', response_model=LimitOffsetPage[NewsRead])
async def get_all_news(limit: int = Query(default=50, lt=101, gt=0),
                       offset: int = Query(default=0, gt=-1),
                       session: AsyncSession = Depends(get_async_session)):
    params = LimitOffsetParams(limit=limit, offset=offset)
    request = select(News).options(
        selectinload(News.comments),
        selectinload(News.author),
        selectinload(News.comments, Comment.author),
    ).order_by(desc(News.created_at))

    return await paginate(session, request, params=params)

То, очевидно, paginate не прочитает мои мысли и не возьмет недостающие параметры из неоткуда. Как мне сообщить ему эти параметры?

Ответы

Ответов пока нет.