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查看

 

 

更多使用方法可详细查看如下:

django-filter官方文档

posted @ 2024-08-23 22:07  未来可期_Durant  阅读(7)  评论(0编辑  收藏  举报