对于列表数据可能需要根据字段进行过滤,我们可以通过添加
django-fitlter
扩展来增强支持。通常做搜索比较多一点。
安装
pip install django-filter
安装应用
INSTALLED_APPS = [
...
'django_filters',
...
]
在配置文件中增加过滤后端的设置
# settings.py
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
在视图中添加filter_fields属性,指定可以过滤的字段
class OrdersManages(ListCreateAPIView):
"""
订单管理
"""
queryset = Orders.objects.all()
serializer_class = OrdersSer
pagination_class = PageNumber
filter_fields = ['id','order_no']
filter类
from django_filters import rest_framework as filters
class OrdersFilter(filters.FilterSet):
create_time__gte = filters.DateTimeFilter(field_name="create_time", lookup_expr='gte')
create_time__lte = filters.DateTimeFilter(field_name="create_time", lookup_expr='lte')
class Meta:
model = Orders # 模型名
fields = ['order_no','create_time']
class OrdersManages(ListCreateAPIView):
queryset = Orders.objects.all()
serializer_class = OrdersSer
pagination_class = PageNumber
# filter_fields = ['id','order_no']
filter_class = OrdersFilter # 过滤类
过滤器类
过滤器类和Django中表单类极其类似,写法基本一样,目的是指明过滤的时候使用哪些字段进行过滤,每个字段可以使用哪些运算。运算符的写法基本参照Django的ORM中查询的写法,比如:大于等于,小于等于用"gte",“lte”等等
可以通过模型快速构建过滤器类
class BookFilter(filters.FilterSet):
class Meta:
model = Bookinfo # 模型名
fields = ['btitle','bcomment'] # 可以使用的过滤字段
Meta中出现的fields是指过滤条件中可以出现的字段,默认是精确判等,查询的时候可以这样用:
# bcomment=80
http://127.0.0.1:8000/book/?btitle=&bcomment=80
如果不是判等,可以自定义过滤字段进行过滤:
- 过滤器中常用的字段类型,这些类型要输模型中对应字段类型兼容
CharFilter 字符串类型
BooleanFilter 布尔类型
DateTimeFilter 日期时间类型
DateFilter 日期类型
DateRangeFilter 日期范围
TimeFilter 时间类型
NumberFilter 数值类型,对应模型中IntegerField, FloatField, DecimalField
- 参数说明:
field_name: 过滤字段名,一般应该对应模型中字段名
lookup_expr: 查询时所要进行的操作,和ORM中运算符一致
- Meta字段说明
model: 引用的模型,不是字符串
fields:指明过滤字段,可以是列表,列表中字典可以过滤,默认是判等;也可以字典,字典可以自定义操作
exclude = ['password'] 排除字段,不允许使用列表中字典进行过滤