2014-02-25 49 views
9

我想能够在peewee中加入多个表。然而,对于我来说,想想如何让它和peewee一起工作,这种情况有点困难。Python peewee加入多个表

我有以下表格:

票务 TicketCategory TicketBooking 事件

这里是我的模型:

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() 

现在我想运行一个查询,将选择所有ticketbookings对于给定的用户。运行我的加入后,我想要加载所有信息 - 我不希望在访问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 
) 

因为事件不是TicketCategory上的外键,所以出现错误。任何帮助将非常感激。

回答

18

去尝试回答这个一次。

(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 
)) 
+3

谢谢,我错过了文档中的开关。 –

+0

对于任何想知道它如何与Flask-RESTful一起工作的人,请使用类似上面的查询语句,一旦获取数据,将记录编组()到列表中。要列入的字段的名称应与列名称的名称相同,而不用表名称作为前缀,如果您在多个表中具有相同名称的列,则要小心,以防您选择所有列。 – OzzyTheGiant

1

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

+0

事件不是TicketCategory上的外键。事件是Ticket上的外键(正如TicketCategory一样)。 –

+0

我想加入活动和ticketcategory的原因是,我不会在我访问ticketbooking.ticket.category或ticketbooking.ticket.event时启动任何新的查询 –