LoginSignup
4
6

More than 5 years have passed since last update.

Django で 生SQL を使う前に検討したい Model.objects.extra

Last updated at Posted at 2016-05-09

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.

とあるので、使わない方がよいのかも…

を使うほうがよさそう

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6