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

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

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

问题

  1. 我有这样的表格
  2. ```python
  3. class Address(Base):
  4. event_id: Mapped[int] = mapped_column(
  5. sa.Integer,
  6. sa.ForeignKey('events.id'),
  7. nullable=False
  8. )
  9. event = relationship(
  10. 'Event',
  11. back_populates='address',
  12. uselist=False
  13. )
  1. class Event(Base):
  2. address = relationship(
  3. 'Address',
  4. uselist=False,
  5. back_populates='event',
  6. )

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

  1. class AddressSchema(BaseModel):
  2. country: str
  3. city: str
  4. street: str
  5. build: str
  6. class EventSchema(BaseModel):
  7. address: Optional[AddressSchema] = Field(...)

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

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

I have such tables

  1. class Address(Base):
  2. event_id: Mapped[int] = mapped_column(
  3. sa.Integer,
  4. sa.ForeignKey('events.id'),
  5. nullable=False
  6. )
  7. event = relationship(
  8. 'Event',
  9. back_populates='address',
  10. uselist=False
  11. )
  1. class Event(Base):
  2. address = relationship(
  3. 'Address',
  4. uselist=False,
  5. back_populates='event',
  6. )

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:

  1. class AddressSchema(BaseModel):
  2. country: str
  3. city: str
  4. street: str
  5. build: str
  6. class EventSchema(BaseModel):
  7. address: Optional[AddressSchema] = Field(...)

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

  1. {"id": 1, "address": {"country": "foocountry", "street": "foostreet"}
  2. </details>
  3. # 答案1
  4. **得分**: 0
  5. 解决方案是为AdressSchema添加`orm_mode = True`
  6. <details>
  7. <summary>英文:</summary>
  8. The solution was to add an `orm_mode = True` for AdressSchema
  9. </details>
  10. # 答案2
  11. **得分**: 0
  12. 你的`Address`模型没有像国家、城市等字段。请更新你的模型和架构:
  13. ```python
  14. import sqlalchemy as sa
  15. import sqlalchemy.orm as so
  16. class Event(Base):
  17. address_id: so.Mapped[int] = so.mapped_column(
  18. sa.ForeignKey("address.id", ondelete="SET NULL"), nullable=True
  19. )
  20. address: so.Mapped[Address] = so.relationship(
  21. back_populates='event', lazy="selectin"
  22. )
  1. class EventSchema(BaseModel):
  2. address: Optional[AddressSchema] = None
  3. class Config:
  4. orm_mode = True
英文:

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

  1. import sqlalchemy as sa
  2. import sqlalchemy.orm as so
  3. class Event(Base):
  4. address_id: so.Mapped[int] = so.mapped_column(
  5. sa.ForeignKey(&quot;address.id&quot;, ondelete=&quot;SET NULL&quot;), nullable=True
  6. )
  7. address: so.Mapped[Address] = so.relationship(
  8. back_populates=&#39;event&#39;, lazy=&quot;selectin&quot;
  9. )
  1. class EventSchema(BaseModel):
  2. address: Optional[AddressSchema] = None
  3. class Config:
  4. 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:

确定