利用django_filters.rest_framework的NumberFilter()实现Django中的数值查询筛选功能
django_filters.rest_framework是Django框架中的一个扩展包,提供了一些用于筛选和过滤查询的功能。
其中,NumberFilter()是一个用于数值查询筛选的过滤器。它允许我们按照指定的数值条件对查询结果进行过滤。
下面是一个使用NumberFilter()的具体例子。
首先,在你的Django项目中安装django_filters和djangorestframework:
pip install django-filter pip install djangorestframework
接下来,我们假设有一个学生模型Student,其中有一个字段age表示学生的年龄。
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
然后,在你的Django应用中创建一个filters.py文件,用于定义过滤器。
from django_filters import rest_framework as filters
from .models import Student
class StudentFilter(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 = Student
fields = ['min_age', 'max_age']
在上面的代码中,我们定义了两个NumberFilter(),一个是min_age,表示最小年龄,另一个是max_age,表示最大年龄。我们通过field_name参数指定要筛选的字段为age,并通过lookup_expr参数指定查询条件为大于等于(gte)和小于等于(lte)。
接下来,在views.py中定义视图函数。
from rest_framework import viewsets
from .models import Student
from .serializers import StudentSerializer
from .filters import StudentFilter
class StudentViewSet(viewsets.ModelViewSet):
queryset = Student.objects.all()
serializer_class = StudentSerializer
filterset_class = StudentFilter
在上述代码中,我们通过设置filterset_class属性为我们定义的StudentFilter,将过滤器应用到这个视图类中。
最后,定义完视图函数后,需要将该视图函数和其对应的URL进行关联。在urls.py中添加如下代码:
from django.urls import include, path
from rest_framework import routers
from .views import StudentViewSet
router = routers.DefaultRouter()
router.register('students', StudentViewSet)
urlpatterns = [
path('', include(router.urls)),
]
通过以上的步骤,我们实现了一个简单的学生模型查询筛选功能。现在可以通过发送GET请求到/students/,来获取所有学生数据。同时我们可以使用min_age和max_age参数来实现对学生年龄的筛选。
例如,发送GET请求到/students/?min_age=20&max_age=30,可以获取年龄在20至30岁之间的学生数据。
总结一下,django_filters.rest_framework的NumberFilter()提供了方便的数值查询筛选功能,可以根据指定的数值条件对查询结果进行过滤。通过在filters.py中定义过滤器类,并在视图函数中使用filterset_class属性将过滤器应用到视图类中,就可以实现这一功能。以上就是一个使用NumberFilter()的示例。
