Как использовать `from_orm`, если модель pydanti c определяет псевдонимы? - PullRequest
0 голосов
/ 06 февраля 2020

Хотя режим ORM в pydanti c задокументирован здесь , к сожалению, нет документации по использованию с псевдонимами.

Как использовать from_orm, если pydanti c модель определяет псевдонимы?

Кажется, что фабрика from_orm забывает обо всех несвязанных именах, если псевдонимы существуют. - См. Сообщение об ошибке и соответствующий код ниже. Это ошибка или функция?

Приведенный ниже фрагмент кода неожиданно завершается с ошибкой проверки:

pydanti c .error_wrappers.ValidationError: 1 ошибка проверки для SimpleModel
threeWordsId
обязательное поле (type = value_error.missing)

from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel, Field

Base = declarative_base()

class SimpleOrm(Base):
    __tablename__ = 'simples'
    three_words_id = Column(String, primary_key=True)

class SimpleModel(BaseModel):
    three_words_id: str = Field(..., alias="threeWordsId")

    class Config:
        orm_mode=True

simple_orm = SimpleOrm(three_words_id='abc')
simple_oops = SimpleModel.from_orm(simple_orm)

1 Ответ

1 голос
/ 13 февраля 2020

Использовать allow_population_by_field_name = True в конфигурации.

Как

from sqlalchemy import Column, String
from sqlalchemy.ext.declarative import declarative_base
from pydantic import BaseModel, Field

Base = declarative_base()


class SimpleOrm(Base):
    __tablename__ = 'simples'
    three_words_id = Column(String, primary_key=True)


class SimpleModel(BaseModel):
    three_words_id: str = Field(..., alias="threeWordsId")

    class Config:
        orm_mode = True
        allow_population_by_field_name = True
        # allow_population_by_alias = True # in case pydantic.version.VERSION < 1.0


simple_orm = SimpleOrm(three_words_id='abc')
simple_oops = SimpleModel.from_orm(simple_orm)

print(simple_oops.json())  # {"three_words_id": "abc"}
print(simple_oops.json(by_alias=True))  # {"threeWordsId": "abc"}


from fastapi import FastAPI

app = FastAPI()


@app.get("/model", response_model=SimpleModel)
def get_model():
    # results in {"threeWordsId":"abc"}
    return SimpleOrm(three_words_id='abc')

...