【问题标题】:Tastypie filtering with multiple values具有多个值的美味过滤
【发布时间】:2012-07-11 06:46:16
【问题描述】:

我有一个关于在美味派中过滤的简单问题。

我想过滤多个值。例如:

/api/v1/message/?accountId=1,5,12

这不起作用。知道我该怎么做吗?

我需要使用高级过滤吗?如果是,我该如何创建这样的过滤器?一个简单的 puesdo 代码示例会很棒!

谢谢!

【问题讨论】:

    标签: django api rest tastypie


    【解决方案1】:

    嗯,

    你可以这样做:

    /api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12

    PS:在过滤元属性中,添加{'accountId': ALL}

    【讨论】:

    • 感谢这个工作:) 但它会使 url 真的很长。如果我需要过滤多个帐户 ID,有没有办法可以更巧妙地做到这一点?
    • 这不会覆盖之前的 GET 参数吗?
    • @Amyth 刚刚检查过,如果您使用 '__in' 工具,它不会。如果你写 /api/v1/message/?accountId=1&accountId=5&accountId=12
    • 当我这样做时,它只会过滤到第一个 accountId 并忽略第二个。也许行为已经改变。 wobbily_col 下面的回答非常适合我。
    【解决方案2】:

    最新版本似乎很容易工作 - 只需使用“__in”:

    /api/v1/message/?accountId__in=1,5,12
    

    (我假设您需要在资源 Meta 类中添加一个条目,filtering = { 'accountId' : ALL })

    【讨论】:

      【解决方案3】:

      您必须构建并应用过滤器。这是一个小sn-p,最好在build_filters中构建过滤器,然后在apply_filters中应用它,但你会明白的

      class Foo(ModelResource):
      
          # regular stuff goes here...
      
          def apply_filters(self, request, applicable_filters):
              base_object_list = super(Foo, self).apply_filters(request, applicable_filters)
              query = request.GET.get('query', None)
              ids = request.GET.get('ids', None)
              filters = {}
              if ids:
                  ids = ids.replace('+', ' ').split(' ')
                  filters.update(dict(id__in=ids))
              if query:
                  qset = (
                      Q(title__icontains=query, **filters) |
                      Q(description__icontains=query, **filters)
                  )
                  base_object_list = base_object_list.filter(qset).distinct()
              return base_object_list.filter(**filters).distinct()
      

      【讨论】:

      【解决方案4】:

      /api/v1/message/?accountId__in=1,5,12
      这对我来说是正确的方法,它简单明了。

      /api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12
      这种方式很奇怪,看起来很丑。

      当然,你需要在资源META中添加filtering = { 'accountId' : ALL }

      【讨论】:

        【解决方案5】:

        您必须在 class Meta 中声明 filtering 列。这是一个默默无闻的安全规则。

        因此,accountId__in=[..] 规则就是其中之一。

        ``` 过滤 = { 'accountId' : ALL } 要么 过滤 = { 'accountId' : [ ..., 'in' ] }

        ```

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-30
          • 2014-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多