Django 生クエリの発行を検討することがあった。
例えば SELECT や WHERE でカラム指定じゃなくて、カラムを元に計算した結果とかを使いたい、みたいな場合。
こんな感じで困った。
- クエリビルダがない!
- プラグインにはあるっぽい!
- でもサポートしているのは PostgreSQL? → 使っているのは MySQL!
あ、ORM オブジェクトに raw メソッドがある…えーと、
entities = Entity.objects.raw("SELECT concat_ws(',', id, name) AS mystr FROM entities WHERE name IN %s", params=(list(names),))
でいいの? でも IN に指定しているリストが通らない。うーん、
でもうまくいかない…
で、もう少し探すとこういうのがあった。
これを使うと、こんな
entities = Entity.objects.extra(
select={'mystr': "concat_ws(',', id, name)"},
where=['name IN %s'],
params=[list(names)]
)
感じで、生よりもうちょっとマシに書けるっぽい。
ただし…!
Use this method as a last resort
This is an old API that we aim to deprecate at some point in the future. Use it only if you cannot express your query using other queryset methods.
とあるので、使わない方がよいのかも…
を使うほうがよさそう