排序
Django Ninja Extra 使用来自 Django-Ninja-Extra 排序模块的 ordering
装饰器提供了一个直观的排序模型。它期望从路由函数结果得到一个查询集或列表。
此功能的灵感来自于 DRF OrderingFilter
属性
def ordering(func_or_ordering_class: Any = NOT_SET, **ordering_params: Any) -> Callable[..., Any]:
- func_or_ordering_class: 定义一个路由函数或一个排序类。默认:
ninja_extra.ordering.Ordering
- ordering_params: 用于初始化排序类的额外参数
更改默认排序类
要更改默认排序类,您需要在 settings.py
中添加 NINJA_EXTRA
变量 ,其中包含键 ORDERING_CLASS
和定义排序类路径的值。
# Django project settings.py
INSTALLED_APPS = [
...
]
NINJA_EXTRA={
'ORDERING_CLASS': 'someapp.somemodule.CustomOrdering'
}
用法
- 如果您未指定
ordering_fields
参数, 则查询集的所有字段都将用于排序。 - 例如,要按用户名对用户进行排序
http://example.com/api/users?ordering=username
- 客户端还可以通过在字段名称前加上 `-` 来指定反向排序,例如:
http://example.com/api/users?ordering=-username
- 也可以指定多个排序:
http://example.com/api/users?ordering=username,email
from typing import List
from ninja_extra.ordering import ordering, Ordering
from ninja_extra import api_controller, route, NinjaExtraAPI
from ninja import ModelSchema
from django.contrib.auth import get_user_model
user_model = get_user_model()
class UserSchema(ModelSchema):
class Config:
model = user_model
model_fields = ['username', 'email']
@api_controller('/users')
class UserController:
@route.get('', response=List[UserSchema])
@ordering(Ordering, ordering_fields=['username', 'email'])
def get_users(self):
return user_model.objects.all()
@route.get('/all-sort', response=List[UserSchema])
@ordering
def get_users_with_all_field_ordering(self):
return [u for u in user_model.objects.all()]
api = NinjaExtraAPI(title='Ordering Test')
api.register_controllers(UserController)
注意
如果您同时使用
paginate
装饰器和ordering
装饰器,paginate
装饰器应该在ordering
装饰器之上,因为首先对数据进行排序,然后对数据进行分页,例如:@route.get('', response=List[UserSchema]) @paginate @ordering(Ordering, ordering_fields=['username', 'email']) def get_users(self): return user_model.objects.all()
评论
本文总阅读量次