【Django】getで取得したクエリーパラメーターを分割して使いたい時

Djangoで開発をしている時に、getで取得した”?”以下で続くクエリーパラメーターを分割して使いたい時はありませんでしょうか。

コード自体はpythonでのコードになりますが、Djangoの開発においてよく使用するケースがありますので紹介します。

概要

getで取得したパラメーターとはつまり、URLにアクセスした時にブラウザ上部には以下のようにそのアクセスしたサイトの住所が表示されるわけです。

https://example.com?target=0&target=1&chapter=1&chapter=2&chapter=3&chapter=4&chapter=5&chapter=6&page=2

行いたい操作としてはドメイン(example.com)を除く、いわゆるクエリパラメーターを分割してうまいこと操作したい時に使います。

題名はDjangoとなっていますが、書くコードはpythonです。

getで取得したクエリパラメーターを分割するコード

それでは早速紹介していきます。

クレイパラメーターをget_paramsの変数として用意しておきます。

get_params = '?target=0&target=1&chapter=1&chapter=2&chapter=3&chapter=4&chapter=5&chapter=6&page=2'

target = []
chapter = []
page = ''
list_params = get_params[1:].split('&')
print(list_params) # ['target=0', 'target=1', 'chapter=1', 'chapter=2', 'chapter=3', 'chapter=4', 'chapter=5', 'chapter=6', 'page=2']
for params in list_params:
    params = params.split('=')
    if params[0] == 'target':
        target.append(params[1])
    elif params[0] == 'chapter':
        chapter.append(params[1])
    elif params[0] == 'page':
        page = params[1]
    else:
        raise RuntimeError('invalid')

print(target) # ['0', '1']
print(chapter) # ['1', '2', '3', '4', '5', '6']
print(page) # 2
  1. 3-5行目で格納する変数を定義
  2. 6行目のget_params[:1]は、get_paramsの”?”を除去の意
  3. 6行目の.split(‘&’)は”&”が出てきたら、”&”を除去してリストに格納する意。つまりprint(list_params)のコメントアウトの通りに表示されます
  4. 9行目の.split(‘=’)も同様で、”=”が出てきたら、”=”を除去してリストに格納する意
  5. 4.の時もしリストに格納した値params[0]が’target’なら3行目で用意したtargetのリストに保存する意
  6. 12行目以下は同じ

そして最終的には、以下のように内部関数として扱うことが多いので、関数化した方が分かり易いですしコードの使い回しができますね。

def _create_params(get_params):
    target = []
    chapter = []
    page = ''
    list_params = get_params[1:].split('&')
    for params in list_params:
        params = params.split('=')
        if params[0] == 'target':
            target.append(params[1])
        elif params[0] == 'chapter':
            chapter.append(params[1])
        elif params[0] == 'page':
            page = params[1]
        else:
            raise RuntimeError('invalid')
            
    return target, chapter, page

get_params = '?target=0&target=1&chapter=1&chapter=2&chapter=3&chapter=4&chapter=5&chapter=6&page=2'
target, chapter, page = _create_params(get_params)

print(target)
print(chapter)
print(page)
  1. 1行目の_create_paramsの_は内部関数を表していて、views.pyの内部でしか使用しない関数はこのように表すことが通例です。


最後に

いかがでしたでしょうか。

以上が、「【Django】getで取得したクエリーパラメーターを分割して使いたい時」の説明記事になります。

今回のコードはforを使い回したベタなコードですが、包表記を使用すればもっと短くかけますし、それ以外にも方法はあります。

読んでもわかりやすいコードを意識して書きましたが、「このような方法も使えるよ」って人はコメントに是非お願いします。

コメントを残す

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