Nat*_*han 3 api django url filtering django-rest-framework
更新二
所以不幸的是,@Reza Torkaman Ahmadi 的想法最终没有实现。这是因为我们的程序有一个依赖于 get_queryset 的过滤函数,而在我们的视图中覆盖 get_queryset 方法会破坏该函数。
所以,我和我的搭档讨论了这个问题,这就是他想出的。
class OrderbyFilter(filters.OrderingFilter):
def get_ordering(self, request, queryset, view):
"""
Ordering is set by a comma delimited ?$orderby=... query parameter.
Extends the OrderingFilter of the django rest framework to redefine
ordering parameters to "asc" and "desc".
"""
params = request.query_params.get(self.ordering_param)
if params:
field_queries = [param.strip() for param in params.split(',')]
fields = []
for field_query in field_queries:
field_query = field_query.split()
if len(field_query) <= 2:
while "asc" in field_query:
field_query.remove("asc")
for i, field in enumerate(field_query):
if field == "desc":
field_query[i-1] = "-" + field_query[i-1]
while "desc" in field_query:
field_query.remove("desc")
fields.append(field_query[0])
else:
fields.append([param.strip() for param in params.split(',')])
ordering = self.remove_invalid_fields(queryset, fields, view, request)
if ordering:
return ordering
return self.get_default_ordering(view)
基本上,这个函数会覆盖 Django REST 的源代码,特别是 OrderingFilter 中的 get_ordering 函数。它的作用是,如果 'asc' 在字段之后的查询中,它会删除它并像正常一样对待它(对于正常的升序排序)
否则,如果存在 'desc',它会删除 'desc',并应用连字符。
更新回答。应用了@Reza Torkaman Ahmadi 的想法,在修改它以满足我的需求后效果很好。谢了哥们!
目前,在 Django API rest 框架中,如果用户想要按升序或降序查看某个列表,他们必须执行以下操作:
'Datastream&order_by=-name' 按降序显示名称 'Datastream&order_by=name' 按升序显示名称。
我想做一个自定义查询,其中输入“Datastream&order_by=asc name”将按升序排列名称,而“desc name”将按降序排列。
我查看了 REST 框架的一些源代码,但我可能看错了领域。被我应该做的事情难住了。有任何想法吗?
你可以用你自己的方式来做。像这样:
class DatastreamViewSet(ModelViewSet):
def get_queryset(self):
queryset = super(DatastreamViewSet, self).get_queryset()
order_by = self.request.query_params.get('order_by', '')
if order_by:
order_by_name = order_by.split(' ')[1]
order_by_sign = order_by.split(' ')[0]
order_by_sign = '' if order_by_sign == 'asc' else '-'
queryset = queryset.order_by(order_by_sign + order_by_name)
return queryset
Run Code Online (Sandbox Code Playgroud)
这将查找查询参数,order_by如果提供,则将其按空格分割,第一个将指示在 order_by 过滤器上使用 + 或 - 符号,第二个将是它的名称。所以把它们放在一起并创建一个文本,将它传递给order_by你的好去处。
例如:
?order_by=asc name
Run Code Online (Sandbox Code Playgroud)
在 Django 中会是这样 =>
return queryset.order_by('name')
Run Code Online (Sandbox Code Playgroud)
Django Rest Framework的标准方式:
from rest_framework.filters import OrderingFilter
然后在你的 APIView 或 ViewSet 上
filter_backends = (OrderingFilter,)
ordering_fields = ['field_name']
Run Code Online (Sandbox Code Playgroud)
查询参数是ordering并且也支持反向排序。
GET https://example.com/?ordering=-field_name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2070 次 |
| 最近记录: |