[Django]Querysetで仮想フィールドを定義する

Djangoでサーバサイドの開発しているときにquerysetfilterメソッドでデータの抽出処理を記述するんですが、取得したデータをクライアントサイドで結合するのがめんどくさくなり、どうにかサーバ側で結合したデータを取得できないか調べてみました。

前提条件

  • Python:3.6.2
  • Django:3.0.2

実現方法

Djangoquerysetextraメソッドを使用すると実現できそうです。

https://docs.djangoproject.com/ja/3.2/ref/models/querysets/#extra

extraメソッドを利用するとSELECT句をそのまま書けるみたいなので、下記のように実装すれば文字列結合済の仮想フィールドを取得できます。

Userモデルに名字(last_name)、名前(first_name)がある場合、フルネームを一つのフィールドとして取得したい場合、

users = User.objects.extra(select={'full_name': "concatenate(last_name, first_name)"})

のように実装すれば、「名字 + 名前」を「full_name」という仮想フィールドで取得することができます。

最後に

サーバサイドでできることはサーバサイドでやっておけば、クライアントサイドの負荷を減らすことができるのでこういったカスタマイズをしっかり覚えておきたいですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です