【问题标题】:Django rest framework custom ordering fieldDjango rest框架自定义排序字段
【发布时间】:2015-09-28 07:06:13
【问题描述】:

我已经在我的 API 上启用了排序,它工作得很好。我的问题是它只允许我按字段值排序。我希望能够进行类似的查询

GET /api/some_endpoint/?crazy_query=123

然后,即使模型没有字段crazy_field,我也希望能够以某种方式对其进行响应。我只是不知道在哪里做。 OrderingFilter 当前通过使用设置DEFAULT_FILTER_BACKENDS 注入到我的所有视图集中。我想我必须创建一个自定义过滤器后端,但我不确定如何去做

【问题讨论】:

  • 您所说的“自定义排序字段”是什么意思?您的 API 应如何响应该确切查询?
  • 我的意思是查询参数不一定与模型字段 fx 一对一映射。使用searchqordering 等。我想知道在 DRF 中我可以在哪里为此类参数实现逻辑
  • 该逻辑的好地方是自定义过滤器后端。您也可以将该逻辑直接放入您的视图中。如果只是对结果进行过滤或排序,则过滤器后端将是最佳选择。
  • @GwynBleidD 我确实想到了这个视图,但正如你所说,它更适合过滤器后端。你能提供一个如何创建这样一个后端的例子吗?

标签: django django-rest-framework


【解决方案1】:

您可以在任何您喜欢的地方添加自定义过滤器后端类。例如。在

restframework_filters/CrazyBackend.py:

class CrazyBackend(filters.BaseFilterBackend):
    """
    My crazy filter.
    """
    def filter_queryset(self, request, queryset, view):
        crazy = request.query_params.get('crazy_query', None)
        if crazy:
            queryset = queryset.filter(...something crazy...)
        return queryset

然后将其添加到设置中:

REST_FRAMEWORK = {
    ...
    'DEFAULT_FILTER_BACKENDS': (
        'restframework_filters.CrazyBackend', ...
    ),

不要忘记新文件夹中的空 __init__.py。

【讨论】:

  • 对于现在正在查看的任何人,request.QUERY_PARAMS 已被弃用,取而代之的是 request.query_params
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多