【DRF配置管理】如何结合ORM模糊搜索、范围查询、实现排序

原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

DRF应用和管理

【DRF配置管理】Django安装DRF框架并生成openapi风格文档
【DRF配置管理】如何实现JWT身份验证
【DRF配置管理】如何使用序列化:验证码、注册和登录
【DRF配置管理】如何结合ORM实现排序、模糊搜索、范围查询
【DRF配置管理】如何在视图类使用get_objects()
【DRF配置管理】如何实现RBAC页面菜单和按钮权限
【DRF配置管理】如何建立coreapi风格api接口文档
【DRF配置管理】如何建立swagger风格api接口文档


文章目录

  • DRF应用和管理
  • 一、drf过滤查询
    • 1.针对当前用户进行筛选
    • 2.根据查询参数进行筛选
    • 3.通用筛选-models字段查询
      • 3.1 默认不包含__gte、__lte等条件查询
      • 3.2 实现__gte、__lte等查询
    • 4.模糊查询
  • 二、排序


一、drf过滤查询

1.针对当前用户进行筛选

from myapp.models import Purchase
from myapp.serializers import PurchaseSerializer
from rest_framework import generics

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        This view should return a list of all the purchases
        for the currently authenticated user.
        """
        user = self.request.user
        return Purchase.objects.filter(purchaser=user)

2.根据查询参数进行筛选

查询链接:http://example.com/api/purchases?username=denvercoder9

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        Optionally restricts the returned purchases to a given user,
        by filtering against a `username` query parameter in the URL.
        """
        queryset = Purchase.objects.all()
        username = self.request.query_params.get('username')
        if username is not None:
            queryset = queryset.filter(purchaser__username=username)
        return queryset

如果想使用orm的__gte、__lte这些方法,可以在这里实现(缺陷是都需要重写),具体代码如下:
查询链接:/api/v1/sar/sarpics/?page=1&size=1&ImagingTime__gte=2020-12-22T00%3A00%3A00Z&ImagingTime__lte=2021-06-22T00%3A00%3A00Z

    def get_queryset(self):
        print('gte', self.request.query_params.get('ImagingTime__gte'))
        ImagingTime__gte = self.request.query_params.get('ImagingTime__gte')
        ImagingTime__lte = self.request.query_params.get('ImagingTime__lte')
        if ImagingTime__gte:
            self.queryset = self.queryset.filter(ImagingTime__gte=ImagingTime__gte)
        if ImagingTime__lte:
            self.queryset = self.queryset.filter(ImagingTime__lte=ImagingTime__lte)
        return self.queryset

3.通用筛选-models字段查询

3.1 默认不包含__gte、__lte等条件查询

django_filters需要导入django-filter库,
查询链接:http://example.com/api/products?category=clothing&in_stock=True

import django_filters.rest_framework
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics
from django_filters.rest_framework import DjangoFilterBackend

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = [DjangoFilterBackend,]
	filterset_fields = ['category', 'in_stock']  # 可指定查询字段,默认无

3.2 实现__gte、__lte等查询

需要自定义FilterSet类,并在视图类中指定filter_class。

filters.py文件

import django_filters

class ProductFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='iexact')  # iexact表示精确匹配, 并且忽略大小写
    author = django_filters.CharFilter(lookup_expr='icontains') #icontains表示模糊查询(包含),并且忽略大小写
    price = django_filters.NumberFilter(look_expr='exact')  #exact表示精确匹配
    desc = django_filters.CharFilter('description', lookup_expr='contains') #对'description'字段进行操作,不填默认为desc
    #price__lte = django_filters.NumberFilter('price', lookup_expr='lte') #lte表示小于
    #price__gte = django_filters.NumberFilter('price', look_expr='gte')  # gte表示大于
	class Meta:
	        model = Product
	        fields = ['name', 'author', 'price', 'description']
	        #fields = {
	             'price': ['lt', 'gt']
	        }

view.py文件

import django_filters.rest_framework
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics
from django_filters.rest_framework import DjangoFilterBackend

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = [DjangoFilterBackend,]
	filterset_fields = ['category', 'in_stock']  # 可指定查询字段,默认全部
	filter_class = ProductFilter

4.模糊查询

查询链接:http://example.com/api/users?search=russell

from rest_framework import filters

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = [filters.SearchFilter]
    search_fields = ['username', 'email']

二、排序

查询链接:http://example.com/api/users?ordering=username ;
http://example.com/api/users?ordering=-username ;
http://example.com/api/users?ordering=account,username

from rest_framework.filters import OrderingFilter, SearchFilter

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ['username', 'email']
    ordering = ['username'] #默认排序

你可能感兴趣的:(Django开始入门,python,django,开发语言)