Djangoでクエリパラメータから配列を受け取る

Djangoでクエリパラメータから配列を受け取る

Djangoでクエリパラメータから配列を受け取る場合、QueryDict.getlist(key, default=None)を使用しましょう。

QueryDict.getlist(key, default=None)

QueryDict.getlist(key, default=None)はクエリーパラメーターの値をlistとして取得することができます。

e.g. https://example.com?foo=1&foo=2

request.GET.getlist('foo', None)  # => [1, 2]

PHPのような配列として渡す場合

PHPのような配列として渡す場合は以下のようになります。

e.g. https://example.com?foo[]=1&foo[]=2

request.GET.getlist('foo[]', None)  # => [1, 2]

あくまでキーは文字列として扱われるため添字には対応していません。

e.g. https://example.com?foo[0]=1&foo[1]=2

request.GET.getlist('foo[]', None)  # => []

RFC 3986

クエリーパラメーターの処理がPHPやJS(query-string)などと異なるため、標準的な仕様をまとめているRFCを確認しましたが、クエリーパラメーターの形式は、key=valueの形式であることぐらいしか言及されていませんでした。

query 構成要素はしばしば “key=value” の対の形式で識別するための情報を運ぶために使用され、そこで頻繁に使用された値は別の URI の参照なので、時にはそれらの文字をパーセントエンコーディングする事を避けるほうがユーザビリティのためにはよい。

Uniform Resource Identifier (URI): 一般的構文

Go言語も添字は上手くパースされないようです。添字は当たり前に使用できるものだと思っていました。

まとめ

e.g. https://example.com?foo[]=1&foo[]=2

request.GET.getlist('foo[]', None)  # => [1, 2]

添字は非対応