ポニーORMクエリを実行し、モデルに存在する3つの属性によってクエリをソートしようとします。まず、ソングタイプ別に、ssf_type_order_map
にリストされている5つの値の1つと、duration(int)およびuuid(string)のいずれかになります。曲のタイプについてはポニーORM - 特定の順序で注文
、私は次の順序でソートされた曲を持っていると思います:フルフル(インストゥルメンタル)、ショートパンツ、ループが、私は次のよう.order_by()
呼び出しを使用して並べ替えしようとすると、それはdoesnの
茎エラーは返されませんが、前述の順序で必要とするタイプでソートされません(継続時間と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
がサポートされていないタイプ 『辞書』を持っている」と言って、これを実行するとき
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))
は、しかし、私はエラーを取得します。
ORDER_BY hereのポニー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と同様の問題に基づく私の前提は、データベースモデルに存在する属性にしかアクセスできないということです。
ポニーもそうだとすれば、私は達成したいことをどうやって引き出すのだろうか?
Spot on!私はもともとsource_file_typeを表すために追加のモデルを追加することを考えていましたが、保守性の問題については迷っています。長いSQL文字列を持つ最初のソリューションは、完璧に働いた、ありがとう! :) –