Как изменить дополнительное поле в модели ответа, чтобы различать, принадлежит ли элемент пользователю, в зависимости от объектов ORM

Я новичок в разработке бэкенда и хочу иметь дополнительное поле в ответе в зависимости от id пользователя. Проект представляет собой мини-приложение для электронной коммерции, где только владелец магазина может редактировать его содержимое. Когда фронтенд запрашивает GetAllShops, как я могу прикрепить булево поле типа is_owner для каждой сущности магазина, возвращаемой из sql alchemy ORM путем сравнения id магазина с id клиента? Заранее спасибо. Я использую Pydantic и FastAPI.

Вы можете сделать это с помощью корневого валидатора, который является наиболее мощным методом:

from pydantic import BaseModel, root_validator


class MyModel(BaseModel):
    client_id: str
    shop_id: str
    is_owner: bool = False

    # Root validators are executed during model instantiation
    # before values are assigned
    @root_validator(pre=True)
    def check_if_owner(cls, values: dict):
        
        if values['client_id'] == values['shop_id']:
            values['is_owner'] = True

        # All done
        return values

Другим более тонким решением является использование обычного валидатора с доступом ко всем значениям класса. Это похоже на то, что описано выше, но специфично только для этого поля. (Примечание: этот метод может стать довольно сложным и запутанным, поэтому действуйте осторожно.)

from pydantic import BaseModel, validator


class MyModel(BaseModel):
    client_id: str
    shop_id: str
    is_owner: bool = False


    @validator('is_owner', always=True)
    def check_if_owner(cls, value, values: dict):
        
        if values['client_id'] == values['shop_id']:
            return True
        else:
            return False
Вернуться на верх