django GETで受け取ったパラメータをquerysetで取得する
リクエストをGETで送る方法
djangoでもGETで送る方法は、他と同じで、HTMLでフォームを作成してGET送信するだけです。
# GETリクエストから値を取得する方法
値の取得は、view.py で行います。他にも色々方法はあると思いますが、分かりやすいです。
以下のようなコードで取得します。
if 'get_tag' in request.GET:
get_tag = request.GET['get_tag']
if文では、request.GETでGETメソッドで送られてきたパラメータのnameを取得し、get_tagというパラメータがあるのかを判定します。
get_tagには、自分でHTMLのフォームで指定したnameが入ります。
querysetでfilterをかける(SQLのWHEREみたいなもの)
productsは変数名なのでなんでも良いです。
ProductはDBのモデル名を指定してください。
fieldname には、DBのフィールド名を入れてください。
get_tagの部分が条件になります。
WHERE文の役割をしてくれるのが、filterです。
今回は、指定したfieldがtag_nameと一致するものを取得する記述になっています。
filterには他にも色々機能があるので、詳しくはこちらの記事を参考にしてください。
sample = Sample.objects.filter(fieldname=get_tag)
queryset filter で複数のパラーメータでAND条件
querysetのfilterでは、ANDの複数条件は、()のなかにカンマ区切りで記述していくだけです。
result = Sample.objects.filter(fieldname1='条件1',fieldname2='条件2',...)
複数のパラメータの分岐
3つのパラーメータを取得できるようにして、指定されたパラメータを反映させたい時があると思います。
しかし、パラメータを全部AND条件にしてしまうと、必ず全てのパラメータを指定しないといけなくなります。
その解決策を書いておきます。
以下のように、パラメータを取得する前に、全てのオブジェクトの条件に引っかかるようなデフォルト値を入れておくことです。
もしもパラメータが指定されていなかった場合は、filterの条件に空の文字列が入ることになります。
そして、空の文字列はcontainsに必ず引っかかるので、パラメータが指定されていない条件は実質無視することになります。
tag1 = ''
tag2 = ''
tag3 = ''
if 'tag1' in request.GET:
tag1 = request.GET['tag1']
if 'tag2' in request.GET:
tag2 = request.GET['tag2']
if 'tag3' in request.GET:
tag3 = request.GET['tag3']
result = Product.objects.filter(field1__contains=tag1,field2__contains=tag2,field3__contains=tag3)
if文の分岐で一生懸命分けてもいいかと思いましたが、個人的にif文が並びすぎるのは嫌いなのでこのようにしました。
Discussion