12

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 の外部キーではないため、エラーが発生します。どんな助けでも大歓迎です。

4

2 に答える 2

24

これにもう一度答えようとします。

(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
 ))
于 2014-02-28T19:21:39.180 に答える