【问题标题】:Python peewee joins multiple tablesPython peewee 连接多个表
【发布时间】:2014-03-27 19:52:56
【问题描述】:

我希望能够在 peewee 中加入多个表。然而,这个场景对我来说有点难以弄清楚如何让它与 peewee 一起工作。

我有以下表格:

门票 票务类别 订票 事件

这是我的模型:

class TicketCategory(BaseModel):
    venue_id = IntegerField()
    name = CharField()
    description = CharField()

class Ticket(BaseModel):
    event = ForeignKeyField(Event)
    category = ForeignKeyField(TicketCategory)
    order_number = IntegerField()
    tier_name = CharField()
    num_available = IntegerField()
    price = DecimalField()

class TicketBooking(BaseModel):
    user_id = IntegerField()
    ticket = ForeignKeyField(Ticket, related_name="ticketbookings")
    price_paid = DecimalField()
    created = DateTimeField()
    deleted = DateTimeField()

class Event(BaseModel):
    venue_id = IntegerField()
    date = DateField()
    event_image_url = CharField()
    start = TimeField()
    end = TimeField()

现在我想运行一个查询,它将选择给定用户的所有票务预订。运行我的加入后,我希望加载所有信息 - 我不希望在访问 ticketbooking.ticket.category.name 或 ticketbooking.ticket.event.description 时启动另一个查询

我不能这样做:

return TicketBooking.select(TicketBooking, Ticket, TicketCategory, Event).join(Ticket).join(TicketCategory).join(Event).where(
        TicketBooking.user_id == user_id,
        TicketBooking.deleted >> None
)

因为 Event 不是 TicketCategory 上的外键,所以我得到一个错误。任何帮助将不胜感激。

【问题讨论】:

    标签: python join foreign-keys peewee


    【解决方案1】:

    打算再回答一次。

    (TicketBooking
     .select(
         TicketBooking, 
         Ticket, 
         TicketCategory, 
         Event)
     .join(Ticket)
     .join(TicketCategory)
     .join(Event)
     .where(
         TicketBooking.user_id == user_id,
         TicketBooking.deleted >> None
     ))
    

    你快到了。试试吧:

    (TicketBooking
     .select(
         TicketBooking, 
         Ticket, 
         TicketCategory, 
         Event)
     .join(Ticket)
     .join(TicketCategory)
     .switch(Ticket)  # <-- switch the "query context" back to ticket.
     .join(Event)
     .where(
         TicketBooking.user_id == user_id,
         TicketBooking.deleted >> None
     ))
    

    【讨论】:

    • 谢谢,我错过了文档中的开关。
    • 对于任何想知道它如何与 Flask-RESTful 一起工作的人,请使用与上述类似的查询,一旦获得数据,将记录 marshal() 到列表中。要编组的字段的名称应该与列名相同,而不用表名作为前缀,如果您在多个表中具有相同名称的列,请小心,以防您选择所有列.
    【解决方案2】:

    试试.join(Event, on=(TicketCategory.venue_id == Event.venue_id))

    【讨论】:

    • 事件不是 TicketCategory 上的外键。 Event 是 Ticket 上的外键(TicketCategory 也是如此)。
    猜你喜欢
    • 1970-01-01
    • 2017-10-10
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    相关资源
    最近更新 更多