python - 获取交叉参考模型
问题描述
我无法在我的代码中访问交叉引用(通过)模型。
正如您在下面的代码中看到的那样,我的交叉引用模型中有一个字段,我想通过 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
解决方案
您的问题不清楚您要做什么...但这里有一些基于您共享的静态方法的示例:
@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)
我希望这可以澄清事情。
推荐阅读
- java - java是否将对象本地放在堆栈上的函数中?
- sql - 如何选择第二列中出现所有值的一列值
- django - django filter(string__icontains) 如何遍历列表?
- hive - Hive 备份和恢复
- css - 如何在 CSS 中创建链接
- maven-3 - 我正在尝试使用 Arquillian 智能测试库但没有成功
- python - 我的 Postgresql COPY 事务还在运行吗?
- python - 为什么第二个 request.session cookie 返回空?
- node.js - 当我尝试创建反应项目时出现错误
- excel - Application.inputbox 在范围选择上抛出错误 424