首页 > 解决方案 > 获取交叉参考模型

问题描述

我无法在我的代码中访问交叉引用(通过)模型。

正如您在下面的代码中看到的那样,我的交叉引用模型中有一个字段,我想通过 SoundFile 模型进行选择,但我似乎无法弄清楚如何。

我是 python 和 peewee 的新手,所以请多多包涵。我有编程经验,只是没有python。我将不胜感激您能提供的任何帮助。

简单介绍一下: 我有一个存储库,在内存中保存了 SoundFile 记录的列表。我正在遍历这些记录并尝试访问交叉引用模型(对于该模型中的字段)。每个模型扩展的 BaseModel 只是设置了 Class Meta。

声音文件模型

from peewee import *
from OgmaChatBot.entities.BaseModel import BaseModel


class SoundFile(BaseModel):
    file_name = TextField()
    short_name = TextField()
    command_available = IntegerField(constraints=[SQL("DEFAULT 0")])

    @staticmethod
    def get_all():
        return SoundFile.select()

    @staticmethod
    def get_one(key):
        return SoundFile.get(SoundFile.id == key)

事件模型

from peewee import *
from OgmaChatBot.entities.BaseModel import BaseModel


class Event(BaseModel):
    event = TextField()

    @staticmethod
    def get_all():
        return Event.select()

    @staticmethod
    def get_one(key):
        return Event.get(Event.id == key)

SoundEvent 模型(交叉引用模型)

from peewee import *
from OgmaChatBot.entities.BaseModel import BaseModel
from OgmaChatBot.entities.Event import Event
from OgmaChatBot.entities.SoundFile import SoundFile


class SoundEvent(BaseModel):
    sound_file = ForeignKeyField(
        column_name='sound_file_id',
        field='id',
        model=SoundFile,
        backref='sound_event'
    )
    event = ForeignKeyField(
        column_name='event_id', 
        field='id', 
        model=Event, 
        backref='sound_event'
    )
    username = TextField(null=True)

    @staticmethod
    def get_all():
        query = (SoundEvent
                 .select(SoundEvent, SoundFile, Event)
                 .join(SoundFile)
                 .switch(SoundEvent)
                 .join(Event))

        return query

    @staticmethod
    def get_one(key):
        query = (SoundEvent
                 .select()
                 .join(SoundFile)
                 .switch(SoundEvent)
                 .join(Event)
                 .where(SoundEvent.id == key))

        return query

标签: pythonpeewee

解决方案


您的问题不清楚您要做什么...但这里有一些基于您共享的静态方法的示例:

@staticmethod
def get_all():
    query = (SoundEvent
             .select(SoundEvent, SoundFile, Event)
             .join(SoundFile)
             .switch(SoundEvent)
             .join(Event))

    return query

然后你可以打印所有文件名:

for sound_event in SoundEvent.get_all():
    print(sound_event.sound_file.filename)

或打印所有事件:

for sound_event in SoundEvent.get_all():
    print(sound_event.event.event)

或者,您也可以从 aSoundFile中列出所有事件:

sound_file = SoundFile.get(SoundFile.filename == 'the-file.mp3')
events = (Event
          .select()
          .join(SoundEvent)
          .where(SoundEvent.sound_file == sound_file))
for event in events:
    print(event.event)

等效于两个连接:

events = (Event
          .select()
          .join(SoundEvent)
          .join(SoundFile)
          .where(SoundFile.filename == 'the-file.mp3'))
for event in events:
    print(event.event)

我希望这可以澄清事情。


推荐阅读