执行 Pony ORM 查询并尝试按模型上的三个属性对查询进行排序。首先是歌曲类型,可以是 中列出的五个值之一ssf_type_order_map
,然后是持续时间(int)和 uuid(字符串)。
对于歌曲类型,我希望歌曲按以下顺序排序:完整、完整(乐器)、短裤、循环、茎
如果我尝试使用以下.order_by()
调用进行排序,它不会返回任何错误,但不会按类型排序,因为我需要按上述顺序进行排序(但持续时间和 UUID 排序工作正常)。
song_source_files = self.song_source_files.select(lambda ssf: True).order_by(lambda ssf: (ssf.type, ssf.duration, ssf.uuid))
这就是我认为理想的查询,将字符串类型映射到对其排序进行排序的映射。
ssf_type_order_map = {
'Full': 1,
'Full (Instrumental)': 2,
'Shorts': 3,
'Loops': 4,
'Stems': 5
}
song_source_files = self.song_source_files.select(lambda ssf: True).order_by(lambda ssf: (ssf_type_order_map[ssf.type], ssf.duration, ssf.uuid))
ssf_type_order_map
但是当我运行这个说“表达式有不支持的类型'dict'时我得到一个错误。
order_by here上的 Pony ORM 文档对在这种情况下使用 lambdas 非常模糊。
更新 - 9 月 7 日
我还尝试在模型上添加以下 getter 属性,如下所示:
@property
def source_type(self):
ssf_type_order_map = {
'Full': 1,
'Full (Instrumental)': 2,
'Shorts': 3,
'Loops': 4,
'Stems': 5
}
return ssy_type_order_map[self.type]
然后我尝试按如下方式对查询进行排序:
song_source_files = self.song_source_files.select(lambda ssf: True).order_by(lambda ssf: (ssf_type_order_map[ssf.type], ssf.duration, ssf.uuid))
但我收到一个错误,基本上说模型没有这个属性。基于 Django 的 ORM 的类似问题,我的假设是您只能访问数据库模型中存在的属性。
如果 Pony 也是这种情况,那么如何完成我想要完成的事情呢?