Pony ORM クエリを実行し、モデルに存在する 3 つの属性でクエリをソートしようとしています。最初に曲の種類 ( にリストされている 5 つの値のいずれか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))
しかし、これを実行すると、「Expression ssf_type_order_map
has unsupported type 'dict'.
ここの order_by に関する Pony ORM ドキュメントは、このコンテキストでラムダを使用することについて非常にあいまいです。
更新 - 9 月 7 日
また、次のようにモデルに次のゲッター プロパティを追加しようとしました。
@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 に関する同様の問題に基づく私の推測は、データベース モデルに存在する属性にしかアクセスできないということです。
ポニーもそうだとしたら、自分がやりたいことをどうやったら実現できるのでしょうか?