django rest framework 数据的查找、过滤、排序的示例

下面是关于 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技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • python使用Flask框架获取用户IP地址的方法

    当我们使用Python编写Web应用程序时,常常需要获取用户的IP地址。使用Flask框架获取用户的IP地址可以通过以下步骤实现: 导入request库。我们可以通过request库的remote_addr属性获取用户的IP地址。remote_addr是request对象的一个属性,它包含了请求方的IP地址。 使用request.remote_addr获取I…

    人工智能概论 2023年5月25日
    00
  • CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)

    下面为你详细讲解在 CentOS 7.2 下编译安装 PHP 7.0.10 + MySQL 5.7.14 + Nginx 1.10.1 的方法,包含示例说明。 1. 准备工作 在安装之前需要先安装相关依赖包,包括: gcc autoconf libxml2 libxml2-devel openssl openssl-devel curl curl-devel…

    人工智能概览 2023年5月25日
    00
  • 关于Django ForeignKey 反向查询中filter和_set的效率对比详解

    标题:关于Django ForeignKey 反向查询中filter和_set的效率对比详解 介绍 在Django中,ForeignKey是一种非常常见的关系,其反向查询也是经常被用到的。在进行反向查询时,通常会使用filter或者_set来获取相关的数据对象,但是这两种方法哪一种更高效呢?本攻略将详细讲解这个问题。 什么是filter和_set filte…

    人工智能概览 2023年5月25日
    00
  • Django跨域请求无法传递Cookie的解决

    当在Django应用中进行跨域请求时,由于浏览器的同源策略限制,无法直接在跨域请求中传递Cookie信息。但是,我们可以通过一些方式解决这个问题,本文将详细介绍Django中跨域请求无法传递Cookie的解决方案及其步骤: 1. 使用CORS CORS(Cross Origin Resource Sharing)是跨源资源共享的缩写。它允许浏览器向跨源服务器…

    人工智能概论 2023年5月25日
    00
  • 修改Nginx与Apache上传文件大小限制

    针对修改Nginx和Apache上传文件大小限制的问题,我将为您分享以下完整攻略。 修改Nginx上传文件大小限制 Nginx的上传文件大小限制包括两个参数,分别为client_max_body_size和client_body_buffer_size。 1. 修改client_max_body_size 第一步,修改Nginx配置文件中的client_ma…

    人工智能概览 2023年5月25日
    00
  • Nginx单向认证的安装配置方法

    安装配置Nginx单向认证需要以下几个步骤: 生成SSL证书 首先,我们需要生成SSL证书。可以使用OpenSSL工具来生成自签名证书,步骤如下: # 生成私钥 openssl genrsa -out server.key 2048 # 生成证书签发请求 openssl req -new -key server.key -out server.csr # 生…

    人工智能概览 2023年5月25日
    00
  • Django Channels 实现点对点实时聊天和消息推送功能

    下面我会详细讲解如何使用 Django Channels 实现点对点实时聊天和消息推送功能。这里的示例要求你已经安装了 Django 3.x 和 Django Channels 3.x。 添加依赖 在使用 Django Channels 之前,需要安装一些依赖: pip install channels channels_redis gunicorn 其中,…

    人工智能概览 2023年5月25日
    00
  • 浅析mmdetection在windows10系统环境中搭建过程

    下面是详细的”浅析mmdetection在windows10系统环境中搭建过程”攻略: 1. 安装Anaconda和CUDA 在Windows10系统环境中,我们首先需要安装Anaconda和CUDA。可以按照以下步骤进行: 下载并安装Anaconda,下载地址:https://www.anaconda.com/products/individual#win…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部