修改响应以在引用外键时获取列表而不是字典列表

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

我有一个简单的应用程序可以创建和存储门票。那些票可以自己交叉引用,所以我用一个特定的表来保存这个信息之王。一个大大简化的表结构是这样的:

class Ticket(Base):
    """Ticket."""
    __tablename__ = "tickets"
    id = Column(Integer, primary_key=True, autoincrement="auto")
    title = Column(String(50), nullable=False)
    children_tickets = relationship(
        "TicketReferences",
        primaryjoin="Ticket.id == TicketReferences.parent_id",
        cascade="all, delete-orphan"
    )
    parents_tickets = relationship(
        "TicketReferences",
        primaryjoin="Ticket.id == TicketReferences.child_id",
        cascade="all, delete-orphan"
    )


class TicketReferences(Base):
    """Tickets can be cross-referenced"""
    __tablename__ = "tickets_references"
    id = Column(Integer, primary_key=True, autoincrement="auto")
    parent_id = Column(Integer, ForeignKey("tickets.id"), nullable=False)
    child_id = Column(Integer, ForeignKey("tickets.id"), nullable=False)

然后我为 pydantic 声明相应的模式:

class TicketsReferences(BaseModel):
    parent_id: int
    child_id: int

    class Config:
        orm_mode = True

class TicketCreate(TicketBase):
    title: str
    parents_tickets: Optional[List[int]] = []
    children_tickets: Optional[List[int]] = []

class Ticket(TicketBase):
    id: int
    title: str
    parents_tickets: List[TicketsReferences]
    children_tickets: List[TicketsReferences]
    class Config:
        orm_mode = True

然后我可以用这些 POST 主体创建票证:

# Creates a first ticket which id will be 1
{
  "title": "Foo",
  "parents_tickets": [],
  "children_tickets": [],
}

# Creates a second ticket referencing ticket 1 as a parent
{
  "title": "Bar",
  "parents_tickets": [1],
  "children_tickets": [],
}

问题是当我请求其中一张票时,我得到一个过于复杂的结构,无论是

parents_tickets
还是
children_tickets

# Fetch ticket #2
{
  "id": 2,
  "title": "bar",
  "parents_tickets": [
    {
      "parent_id": 1,
      "child_id": 2
    }
  ],
  "children_tickets": []
}

我想得到一个这样的 id 列表:

"parents_tickets": [1]
就是这样。怎么做?

python fastapi pydantic
© www.soinside.com 2019 - 2024. All rights reserved.