1、安装配置
Django-filter 支持的Python版本和Django版本、DRF版本如下:
- Python: 3.5, 3.6, 3.7, 3.8
- Django: 1.11, 2.0, 2.1, 2.2, 3.0
- DRF: 3.10+
安装
pip install django-filter
注册应用
INSTALLED_APPS = [
...
'django_filters',
]
models.py
class Userinfo(models.Model):
name = models.CharField(max_length=10, verbose_name='姓名')
age = models.IntegerField(verbose_name='年龄')
......
class Meta:
db_table = 'userinfo'
verbose_name = "用户"
2、使用方法#
方式1:
视图层直接设置过滤字段
# 以name和age过滤
class UserView(ListAPIView):
queryset = userinfo.objects.all()
serializer_class = UserInfoSerializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('name', 'age')
filter_backends 配置 过滤器,也可以在 setting.py 文件全局配置
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),
}
设置了过滤字段name和age,默认是 精确过滤,name 必须全部匹配到
方式2:
自定义过滤器类:
模糊过滤
import django_filters
from user.models import User
class UserFilter(django_filters.FilterSet):
class Meta:
model = Userinfo
fields = {
"name": ['icontains'],
"age": ['exact'],
}
更改视图
class UserView(ListAPIView):
queryset = Userinfo.objects.all()
serializer_class = UserInfoSerializer
# 指定过滤器类
filter_class = UserFilter
范围过滤
class UserFilter(django_filters.FilterSet):
age_gte = django_filters.NumberFilter(field_name='age', lookup_expr='gte')
age_lte = django_filters.NumberFilter(field_name='age', lookup_expr='lte')
class Meta:
model = Userinfo
fields = {
"name": ['icontains'],
}
参数说明:
exact:默认的过滤方式,精确判等
icontains:模糊过滤
field_name:过滤的字段名,要与模型类中所对应
lookup_expr:查询时所要进行的操作,和ORM中运算符一致
生成的过滤器
name 精确查找
name__icontains 模糊查找
age__gte 大于等于
age__lte 小于等于