【问题标题】:django-rest-framework : list parameters in URLdjango-rest-framework :在 URL 中列出参数
【发布时间】:2017-01-09 16:08:27
【问题描述】:

我对 django 和 django-rest-framework 很陌生,但我正在尝试将列表传递给 url 参数,然后通过它们过滤我的模型。

假设客户端应用程序正在发送一个看起来像这样的请求......

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

我想将这些参数“things”、“subthings”和“years”及其值一起传入。

网址在哪里看起来像这样?

注意:诀窍是每个参数并不总是长度为 3 的数组。

有人可以指出我的 url 正则表达式应该如何处理列表以及在我的视图中检索查询列表的正确方向吗?

谢谢!

【问题讨论】:

标签: python django rest django-rest-framework


【解决方案1】:

感谢上面的文档链接,以展示我是如何做到这一点的。 注意:我使用管道作为我的 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

如果它们无效,我确实需要检查空结果。但这里是希望在查询参数中传递多个值的人们的起点。

这里的有效网址是/?something=1|2|3&subthing=4|5|6&year=2015|2016

【讨论】:

  • 使用管道代替逗号有什么好处吗?
【解决方案2】:

查看此文档http://www.django-rest-framework.org/api-guide/filtering/

查询参数通常不通过 url 正则表达式验证

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2020-06-07
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2020-08-01
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多