简体   繁体   English

Python peewee加入了多个表

[英]Python peewee joins multiple tables

I want to be able to join multiple tables in peewee. 我希望能够加入peewee中的多个表格。 However the scenario is a little difficult for me to figure out how to get it to work with peewee. 然而,这个场景对于我弄清楚如何使它与peewee一起工作有点困难。

I have the following tables: 我有以下表格:

Ticket TicketCategory TicketBooking Event Ticket TicketCategory TicketBooking活动

Here are my models: 这是我的模特:

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

Now I want to run a query which will select all the ticketbookings for a given user. 现在我想运行一个查询,它将选择给定用户的所有票证。 After running my join, I want all the info to be loaded -- I don't want another query to be launched when I access ticketbooking.ticket.category.name or ticketbooking.ticket.event.description 运行我的连接后,我希望加载所有信息 - 我不希望在访问ticketbooking.ticket.category.name或ticketbooking.ticket.event.description时启动另一个查询

I cannot just do this: 我不能这样做:

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

Because Event is not a foreign key on TicketCategory, so I get an error. 因为Event不是TicketCategory上的外键,所以我收到错误。 Any help would be much appreciated. 任何帮助将非常感激。

Going to try answering this one more time. 打算再试一次这个问题。

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

You're almost there. 你快到了。 Try instead: 尝试改为:

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM