web-dev-qa-db-ja.com

django-rest-framework:URLにパラメーターをリストする

私はDjangoとDjango-rest-frameworkにかなり慣れていませんが、リストをurlパラメーターに渡して、モデルをフィルターでフィルタリングしようとしています。

クライアントアプリケーションが次のようなリクエストを送信しているとしましょう...

  url: "api.com/?something=string,string2,string3&?subthings=sub,sub2,sub3&?year=2014,2015,2016/"

これらのパラメータ「things」、「subthings」、「years」をそれらの値とともに渡したいと思います。

URLは次のようになりますか?

注:トリックは、各パラメーターの長さが3の配列であるとは限らないことです。

誰かが私のURL正規表現がリストをどのように処理し、ビューでクエリリストを取得するかについて正しい方向に私を向けることができますか?.

ありがとう!

9
JT.

上記のドキュメントリンクのおかげで、私がこれをどのように行ったかを示すために。注:コンマではなく、URL区切り文字としてパイプを使用しました-> '|'。

私のurls.py

url(r'^$', SomethingAPIView.as_view(), name='something'),

私のviews.py

class SomethingAPIView(ListAPIView):
  # whatever serializer class

  def get_queryset(self):
    query_params = self.request.query_params
    somethings = query_params.get('something', None)
    subthings = query_params.get('subthing', None)
    years = query_params.get('year', None)

    # create an empty list for parameters to be filters by 
    somethingParams = []
    subthingsParams = []
    yearParams = []

    # create the list based on the query parameters
    if somethings is not None:
      for something in somethings.split('|'):
        countryParams.append(int(something))
    if subthings is not None:
      for subthing in subthings.split('|'):
        subthingsParams.append(int(subthing))
    if years is not None:
      for year in years.split('|'):
        yearParams.append(int(year))

    if somethings and subthings and years is not None:
      queryset_list = Model.objects.all()
      queryset_list = queryset_list.filter(something_id__in=countryParams)
      queryset_list = queryset_list.filter(subthing_id__in=subthingsParams)
      queryset_list = queryset_list.filter(year__in=yearParams)
      return queryset_list

有効でない場合は、空の結果を確認する必要があります。しかし、ここにクエリパラメータで複数の値を渡したい人のための出発点があります。

ここでの有効なURLは/?something=1|2|3&subthing=4|5|6&year=2015|2016

8
JT.

このドキュメントをチェックアウト http://www.Django-rest-framework.org/api-guide/filtering/

クエリパラメータは通常、URL正規表現によって検証されません

7
glmvrml