REST framework:过滤
一、数据准备
模型类
class UserInfo(models.Model): name = models.CharField(max_length=20, verbose_name='用户名') pwd = models.CharField(max_length=18, verbose_name='密码') email = models.EmailField(max_length=40, verbose_name='邮箱') age = models.IntegerField(verbose_name='年龄', default=18) def __str__(self): return self.name class Meta: db_table = 't_user' # 模型Addr关联userinfo, class Addr(models.Model): user = models.ForeignKey('UserInfo', verbose_name='所属用户', on_delete=models.CASCADE) mobile = models.CharField(verbose_name='手机号', max_length=18) city = models.CharField(verbose_name='城市', max_length=10) info = models.CharField(verbose_name='详细地址', max_length=200) def __str__(self): return self.info class Meta: db_table = 't_address'
序列化器类
class UserInfoSerializer(serializers.ModelSerializer): class Meta: model = UserInfo fields = '__all__' class AddrSerializer(serializers.ModelSerializer): class Meta: model = Addr fields = '__all__'
视图类
class UserView(ModelViewSet): # 指定模型类查询集 queryset = UserInfo.objects.all() # 指定序列化器类 serializer_class = UserInfoSerializerclass AddrView(ModelViewSet): # 指定模型类查询集 queryset = Addr.objects.all() # 指定序列化器类 serializer_class = AddrSerializer
二、相关配置
对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持
pip install django-filter -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
在配置文件中增加过滤后端的设置
# 注册应用, INSTALLED_APPS = [ ... 'django_filters', ] # 指定过滤器 REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) }
三、过滤器的基本使用(直接指定过滤字段方式)
在视图中添加filterset_fields属性,指定可以过滤的字段
class UserView(ModelViewSet): # 指定模型类查询集 queryset = UserInfo.objects.all() # 指定序列化器类 serializer_class = UserInfoSerializer #直接指定过滤字段 filterset_fields = ('name', 'email',)
指定过滤字段之前
指定过滤字段之后
四、自定义过滤器类
1、在应用下新建filters.py文件
from django_filters import rest_framework as filters from books.models import UserInfo class UserInfoFilter(filters.FilterSet): """自定义过滤器类""" # min_price = filters.NumberFilter(field_name="price", lookup_expr='gte') # max_price = filters.NumberFilter(field_name="price", lookup_expr='lte') class Meta: model = UserInfo fields = ['name', 'email']
2、在视图类下面指定过滤器类
class UserView(ModelViewSet): # 指定模型类查询集 queryset = UserInfo.objects.all() # 指定序列化器类 serializer_class = UserInfoSerializer # 直接指定过滤字段 # filterset_fields = ('name', 'email',) # 指定过滤器类 filterset_class = UserInfoFilter
3、范围过滤
在自定义过滤器类可以这样子设置
class UserInfoFilter(filters.FilterSet): """自定义过滤器类""" min_age = filters.NumberFilter(field_name="age", lookup_expr='gte') max_age = filters.NumberFilter(field_name="age", lookup_expr='lte') class Meta: model = UserInfo fields = ['name', 'email', ]
查看接口文档的查询参数
postman查询
4、模糊匹配
设置
class UserInfoFilter(filters.FilterSet): """自定义过滤器类""" min_age = filters.NumberFilter(field_name="age", lookup_expr='gte') max_age = filters.NumberFilter(field_name="age", lookup_expr='lte') class Meta: model = UserInfo # fields = ['name', 'email', ] fields = { 'name': ['exact', 'icontains'], }
接口文档
postman查询
五、使用关联模型类属性过滤
过滤器类
class AddrFilter(filters.FilterSet): """自定义过滤器类""" # user = filters.NumberFilter(field_name="user", lookup_expr='gte') class Meta: model = Addr fields = ['user']
视图类引用
class AddrView(ModelViewSet): # 指定模型类查询集 queryset = Addr.objects.all() # 指定序列化器类 serializer_class = AddrSerializer # 指定过滤器类 filterset_class = AddrFilter
接口文档
postman查看
使用name查询地址列表
class AddrFilter(filters.FilterSet): """自定义过滤器类""" name = filters.CharFilter(field_name="user__name", label='用户name属性') class Meta: model = Addr fields = ['user']
postman查看
更多使用方法可详细查看如下:
知道、想到、做到、得到