下面是关于 Django Rest Framework 的数据查找、过滤、排序示例的攻略:
1.准备工作
要使用Django Rest Framework进行数据查找、过滤和排序,需要做以下准备工作:
- 安装Django Rest Framework
pip install djangorestframework
- 在项目的settings.py中安装DRF
INSTALLED_APPS = (
...
'rest_framework',
)
2. 数据查找的示例
在DRF中,数据查找的关键字为filter。在视图中,可以添加多个过滤器来实现数据查找的功能。下面是一个数据查找的示例:
2.1.示例代码
# models.py
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
rating = models.IntegerField()
# serializers.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
# views.py
class BookList(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [filters.OrderingFilter, filters.SearchFilter, DjangoFilterBackend]
search_fields = ['title', 'author']
filterset_fields = ['rating']
ordering_fields = ['title', 'rating']
2.2.说明
在视图代码中,我们定义了filter_backends属性,这里我们指定了3种过滤器:OrderingFilter、SearchFilter和DjangoFilterBackend。
- OrderingFilter
这个过滤器允许客户端使用ordering查询参数对数据进行排序。
ordering_fields属性指定了可以排序的字段列表,客户端将使用逗号分隔的字段来指定查询顺序。后续的代码中,我们指定允许根据Book的title和rating排序。
- SearchFilter
这个过滤器允许客户端使用search查询参数对数据进行模糊匹配搜索。
search_fields属性指定了可以搜索的字段列表,客户端将使用逗号分隔的字段来指定查询条件。后续的代码中,我们指定允许根据Book的title和author进行搜索。
- DjangoFilterBackend
这个过滤器使用Django-Filters提供的功能实现了客户端通过filter查询参数对数据进行过滤。
filterset_fields属性指定了可以过滤的字段列表,客户端将使用过滤器的名称和值来指定过滤条件。后续的代码中,我们指定允许根据Book的rating进行过滤。
在上述示例中,我们已经实现了3种过滤器。现在我们可以通过访问BookList视图来进行数据的过滤、查找和排序的操作:
- 根据title和rating进行排序
http://localhost:8000/books?ordering=title,rating
- 根据title或author进行模糊匹配搜索
http://localhost:8000/books?search=hello
- 根据rating进行过滤
http://localhost:8000/books?rating=3
3. 数据过滤的示例
在DRF中,数据过滤的关键字为filter。在视图中,我们使用Django-Filters来实现数据过滤的功能。下面是一个数据过滤的示例:
3.1.示例代码
# models.py
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
publisher = models.CharField(max_length=100)
publication_date = models.DateField()
rating = models.IntegerField()
# serializers.py
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
# filters.py
class BookFilter(django_filters.FilterSet):
title = django_filters.CharFilter(lookup_expr='icontains')
author = django_filters.CharFilter(lookup_expr='icontains')
publisher = django_filters.CharFilter(lookup_expr='icontains')
publication_date = django_filters.DateFilter()
rating = django_filters.NumberFilter()
class Meta:
model = Book
fields = ['title', 'author', 'publisher', 'publication_date', 'rating']
# views.py
class BookList(generics.ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend]
filterset_class = BookFilter
3.2.说明
在视图代码中,我们定义了filter_backends属性和filterset_class属性,这里我们指定了DjangoFilterBackend过滤器和自定义的BookFilter过滤器。
- DjangoFilterBackend
这个过滤器使用Django-Filters提供的功能实现了客户端通过filter查询参数对数据进行过滤。
- BookFilter
这个过滤器继承自django_filters.FilterSet类并且实现了对Book模型的过滤。
在上述示例中,我们定义了5个字段:title、author、publisher、publication_date和rating,并分别实现了对应的过滤器。
- title和author字段使用的是CharFilter,允许客户端使用icontains进行查找title或author字段;
- publisher字段使用的是CharFilter允许客户端使用icontains进行查找publisher字段;
- publication_date字段使用的是DateFilter允许客户端使用等于或者范围查询;
- rating字段使用的是NumberFilter允许客户端使用整数等于或者范围查询;
我们已经实现了BookFilter过滤器,在上述示例的视图中,我们通过filterset_class属性指定了BookFilter过滤器。
现在我们可以通过访问BookList视图来进行数据的过滤的操作:
- 根据title或者author进行查找
http://localhost:8000/books?title=hello
http://localhost:8000/books?author=world
- 根据publication_date进行范围查找
http://localhost:8000/books?publication_date__gt=2022-08-05
http://localhost:8000/books?publication_date__lt=2022-08-05
- 根据rating进行范围查找
http://localhost:8000/books?rating__gt=3
http://localhost:8000/books?rating__lt=3
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django rest framework 数据的查找、过滤、排序的示例 - Python技术站