Pydantic如何获得关系值

问题描述 投票:0回答:2

我需要从

pydantic
BaseModel
中的关系多对一模型中获取一个值。 我怎样才能做到这一点?

我的孩子班

class Picnic(Base):
    __tablename__ = 'picnic'

    id = Column(Integer, primary_key=True, autoincrement=True)
    city_id = Column(Integer, ForeignKey('city.id'), nullable=False)

    city = relationship('City', backref='picnics')


class City(Base):
    __tablename__ = 'city'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String, unique=True, nullable=False, index=True)

我需要获取城市名称值:

class Picnics(BaseModel):
    id: int
    # city: str[CityBaseInDB.name] not working
    # city: str = Field(source='city.name') not working 
    # city_name: str not working


    class Config:
        orm_mode: bool = True
sqlalchemy fastapi pydantic
2个回答
1
投票

您的父模型也需要一个 pydantic 模型,并将其作为关系字段中的类型。

from pydantic import BaseModel


class City(BaseModel):
    id: int
    name: str

    class Config:
        orm_mode: bool = True


class Picnics(BaseModel):
    id: int
    city: City

    class Config:
        orm_mode: bool = True

0
投票
from sqlalchemy import Column, ForeignKey, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session, relationship, sessionmaker, Query
from pydantic import BaseModel

Base = declarative_base()
engine = create_engine("sqlite://", echo=True)


class Picnic(Base):
    __tablename__ = 'picnic'

    id = Column(Integer, primary_key=True, autoincrement=True)
    city_id = Column(Integer, ForeignKey('city.id'), nullable=False)

    city = relationship('City', backref='picnics')


class City(Base):
    __tablename__ = 'city'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String, unique=True, nullable=False, index=True)


class PicnicModel(BaseModel):
    id: int
    # city: str[CityBaseInDB.name] not working
    # city: str = Field(source='city.name') not working
    city_name: str

    class Config:
        orm_mode: bool = True


picnic = Picnic(city=City(name='Shenzhen'))
Base.metadata.create_all(engine)
LocalSession = sessionmaker(bind=engine)
db: Session = LocalSession()
db.add(picnic)
db.commit()

q: Query = db.query(Picnic.id, City.name.label('city_name'))
q = q.select_from(Picnic).join(City)
row = q.one_or_none()
model = PicnicModel.from_orm(row)
print(model)
© www.soinside.com 2019 - 2024. All rights reserved.