如何在SQLAlchemy + Pydantic中从相关字段预加载数据?

huangapple go评论71阅读模式
英文:

How to pre-load data from related field in sqlalchemy + pydantic?

问题

我有这样的表格
```python
class Address(Base):
    event_id: Mapped[int] = mapped_column(
        sa.Integer,
        sa.ForeignKey('events.id'),
        nullable=False
    )
    event = relationship(
        'Event',
        back_populates='address',
        uselist=False
    )
class Event(Base):
    address = relationship(
        'Address',
        uselist=False,
        back_populates='event',
    )

然后我创建事件如下:event = Event(**data), session.add(event), session.commit()
所以当我尝试EventSchema.from_orm(event_instance)时,
我得到错误,提示“值不是有效的字典(类型错误.dict)”
以下是我的EventSchema:

class AddressSchema(BaseModel):
    country: str
    city: str
    street: str
    build: str

class EventSchema(BaseModel):
    address: Optional[AddressSchema] = Field(...)

那么,我如何预加载数据以避免此错误?
我希望得到如下响应:

{"id": 1, "address": {"country": "foocountry", "street": "foostreet"}}
英文:

I have such tables


class Address(Base):
    event_id: Mapped[int] = mapped_column(
        sa.Integer,
        sa.ForeignKey('events.id'),
        nullable=False
    )
    event = relationship(
        'Event',
        back_populates='address',
        uselist=False
    )
class Event(Base):
    address = relationship(
        'Address',
        uselist=False,
        back_populates='event',
    )

And I create event like event = Event(**data), session.add(event), session.commit()
So when I try to EventSchema.from_orm(event_instance)
then I got error, that value is not a valid dict (type=type_error.dict)
Here is my EventSchema:


class AddressSchema(BaseModel):
    country: str
    city: str
    street: str
    build: str


class EventSchema(BaseModel):
    address: Optional[AddressSchema] = Field(...)

So, how I can pre-load data, to avoid this error?
I`d like to get such response:

{"id": 1, "address": {"country": "foocountry", "street": "foostreet"}

</details>


# 答案1
**得分**: 0

解决方案是为AdressSchema添加`orm_mode = True`。

<details>
<summary>英文:</summary>

The solution was to add an `orm_mode = True` for AdressSchema

</details>



# 答案2
**得分**: 0

你的`Address`模型没有像国家、城市等字段。请更新你的模型和架构:

```python
import sqlalchemy as sa
import sqlalchemy.orm as so


class Event(Base):
    address_id: so.Mapped[int] = so.mapped_column(
        sa.ForeignKey("address.id", ondelete="SET NULL"), nullable=True
    )
    address: so.Mapped[Address] = so.relationship(
        back_populates='event', lazy="selectin"
    )
class EventSchema(BaseModel):
    address: Optional[AddressSchema] = None

    class Config:
        orm_mode = True
英文:

Your Address model doesn't have fields like country, city etc. Update your models and schema:

import sqlalchemy as sa
import sqlalchemy.orm as so


class Event(Base):
    address_id: so.Mapped[int] = so.mapped_column(
        sa.ForeignKey(&quot;address.id&quot;, ondelete=&quot;SET NULL&quot;), nullable=True
    )
    address: so.Mapped[Address] = so.relationship(
        back_populates=&#39;event&#39;, lazy=&quot;selectin&quot;
    )
class EventSchema(BaseModel):
    address: Optional[AddressSchema] = None

    class Config:
        orm_mode = True

huangapple
  • 本文由 发表于 2023年6月12日 21:05:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/76456968.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定