【问题标题】:How to query 'or' conditions to RESTful API by query string parameters?如何通过查询字符串参数查询 RESTful API 的“或”条件?
【发布时间】:2015-06-12 04:06:46
【问题描述】:

很多人说开发人员在查询带有条件的 RESTful API 时应该使用查询字符串参数。

我同意他们的观点,并且我在我的 django 项目中使用 django-rest-framework 和平地实现 RESTful API,直到我遇到一种情况,我必须使用 条件进行查询,而不是 查询字符串中的& 字符支持的条件。

如果我想查询我这周最近修改的日志历史,例如,它会是这样的:

my-site/api/log?created=-7,*&modified=-3,*

但由于查询字符串使用& 附加参数,我找不到任何优雅的解决方案来过滤我的资源 or 条件。

我正在寻找的是,例如:

my-site/api/log?created=-1[OR]created=-2[OR] ...

那么有什么好的、简洁和宁静的方式来添加 or 条件到我的查询字符串?

【问题讨论】:

  • created=-1_-2_5created=-1+-2+5 怎么样,然后在 python 中,用 OR 替换 _,用 AND 替换 +

标签: django rest django-rest-framework


【解决方案1】:

这是我的想法:
您可以为 api 调整您的 get_queryset()

def get_queryset(self):
    """
    Override get_queryset() to filter on multiple values for 'created'
    """

    created = self.request.QUERY_PARAMS.get('created', None)
    if created:
        created_list = created.split(',')
        if len(created_list)>1:
            queryset = yourmodel.objects.filter(created__in=created_list)
        elif len(created_list) == 1:
            queryset = yourmodel.objects.filter(created=created_list[0])

    return queryset

请求将是:
单个请求:my-site/api/log?created=-7
多请求:my-site/api/log?created=-7,6,1,2

【讨论】:

    【解决方案2】:

    只需重复kwarg

    >>> from django.http import QueryDict
    >>> q = QueryDict('a=1&a=2&a=3')
    >>> q.getlist('a')
    [u'1', u'2', u'3']
    >>> q.get('a')
    u'3'
    

    docs 中了解更多关于QueryDict 的信息。

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 2015-04-19
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2015-02-16
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多