我有一个简单的应用程序可以创建和存储门票。那些票可以自己交叉引用,所以我用一个特定的表来保存这个信息之王。一个大大简化的表结构是这样的:
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]
就是这样。怎么做?