【问题标题】:Django Rest Framework - how to use different query params format?Django Rest Framework - 如何使用不同的查询参数格式?
【发布时间】:2019-10-20 02:18:10
【问题描述】:

我使用 [https://www.npmjs.com/package/vue-bootstrap4-table#8-filtering][1]django-rest-framework

问题在于该组件使用完全不同的查询参数进行排序、过滤等。

vue-bootstrap4-table

http://127.0.0.1:8000/api/products/?queryParams=%7B%22sort%22:[],%22filters%22:[%7B%22type%22:%22simple%22,%22name%22:%22code%22,%22text%22:%22xxx%22%7D],%22global_search%22:%22%22,%22per_page%22:10,%22page%22:1%7D&page=1

"filters":[{"type":"simple","name":"code","text":"xxx"}],

Django-rest-framework 需要这种格式:

../?code__icontains=...

我想弄清楚如何让DRF 接受这种格式而不是内置格式?

我只使用ViewSet

class ProductViewSet(viewsets.ModelViewSet):
    serializer_class = ProductSerializer
    filter_class = ProductFilter
    filter_backends = [filters.OrderingFilter]
    ordering_fields = '__all__'

有可能吗?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    翻译成:

    http://127.0.0.1:8000/api/products/?queryParams={"sort":[],"filters":[{"type":"simple","name":"code","text":"xxx"}],"global_search": "","per_page":10,"page":1}&page=1

    看起来您仍然应该手动将这些参数序列化为正确的格式,或者在请求正文中发送它们而不是作为查询参数。

    我不知道让 DRF 自动处理这个问题的无痛方法。但是,由于 'queryParams' 的值是有效的 JSON,您可以覆盖 ModelViewSet 上所需的方法。 This page 描述了您可以覆盖的方法。要将 json 转换为 dict,您可以执行 json.loads(request.query_params['queryParams'])。从那时起,您可以使用 ORM 手动过滤和排序。

    或者,当然,您可以将查询参数转换为“常规”查询参数客户端。这是一个很棒的库,可以帮助你解决这个问题:https://medialize.github.io/URI.js/

    此外,允许用户对任何字段进行排序通常是不明智的。对于产品,这可能风险相对较低,但don't make it a common practice.

    【讨论】:

      猜你喜欢
      • 2016-11-17
      • 2018-07-28
      • 2023-03-30
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多