• [django]drf知识点梳理-搜索


    什么是搜索?
    譬如http://127.0.0.1:8000/User/?username=maotai-0 可以检索出想要的.

    自己实现原始的搜索

    重写下get_queryset方法

    class UserViewset(viewsets.ReadOnlyModelViewSet):
        '''
        List:
            查询用户列表
        Retrieve:
            查询某用户详情
        '''
        queryset = user.objects.all()
        serializer_class = UserSerialiser
    
        def get_queryset(self):
            queryset = super(UserViewset, self).get_queryset()
            username = self.request.query_params.get('username', None)
            if username:
                queryset = queryset.filter(username__icontains=username)
            return queryset
    

    使用django-filter来实现搜索-支持drf

    • 准备数据
    - script/add_user.py
    
    import sys
    import os
    
    project_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
    sys.path.append(project_dir)
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ops.settings")
    
    import django
    django.setup()
    from django.contrib.auth import get_user_model
    User = get_user_model()
    
    def get_users():
        for user in User.objects.all():
            print(user.username)
    
    if __name__ == "__main__":
        get_users()
    
    
    • 配置搜索
    pip install django_filters
    安装到app
    
    
    
    注: django_filters.rest_framework.DjangoFilterBackend 已支持drf.
    

    使用系统内置的filterbackend

    from django_filters.rest_framework import DjangoFilterBackend
    from rest_framework import viewsets
    from .serializer import UserSerialiser
    
    class UserViewset(viewsets.ReadOnlyModelViewSet):
        '''
        List:
            查询用户列表
        Retrieve:
            查询某用户详情
        '''
        queryset = user.objects.all()
        serializer_class = UserSerialiser
    
        filter_backends = (DjangoFilterBackend,) # 指定backends
        filter_fields = ('username',)            # 指定要搜索的字段(默认是全匹配的,不支持模糊,大小写)
    

    指定filter_class 实现username模糊匹配

    - users/filters.py
    
    import django_filters
    from django.contrib.auth import get_user_model
    User = get_user_model()
    
    class UserFilter(django_filters.FilterSet):
        username = django_filters.CharFilter(field_name="username", lookup_expr='contains')
    
        class Meta:
            model = User
            fields = ['username']
    
    - users/vuews.py
    
    class UserViewset(viewsets.ReadOnlyModelViewSet):
        """
        retrieve:
            返回指定用户信息
        list:
            返回用户列表
        """
        queryset = User.objects.all()
        serializer_class = UserSerializer
        filter_backends = (DjangoFilterBackend,) # 也可以将这个end放在settings.py里. 全局model就不需要写这个字段了
        filter_class = UserFilter
        filter_fields = ("username",)
    

    将backend放在settings.py里

    - settings.py
    
    REST_FRAMEWORK = {
        "PAGE_SIZE": 10,
        #"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination",
        "DEFAULT_PAGINATION_CLASS":"users.pagination.Pagination",
        'DEFAULT_FILTER_BACKENDS': (
            'django_filters.rest_framework.DjangoFilterBackend',
        )
    }
    

    指定method搜索

    servers/filters.py
    
    import django_filters
    from django.db.models import Q
    
    from .models import Server
    
    server_queryset = Server.objects.all()
    
    
    class ServerFilter(django_filters.FilterSet):
        hostname = django_filters.CharFilter(method="search_hostname")
    
        def search_hostname(self, queryset, name, value):
            return queryset.filter(Q(hostname__icontains=value) | Q(ip__icontains=value))
    
        class Meta:
            model = Server
            fields = ['hostname']
    
    class ServerViewset(viewsets.ReadOnlyModelViewSet):
        """
        list:
            列出所有服务器信息
        retrieve:
            读取一个服务器信息
        """
        queryset = Server.objects.all()
        serializer_class = ServerSerializer
        filter_class = ServerFilter
        filter_fields = ('hostname',)
    

  • 相关阅读:
    Linux磁盘分区MBR分区
    win10 1809磁盘占用总是100%
    LINUX系统的7种运行级别
    【工作环境】公司主域控硬盘损坏后的维修步骤
    程序员的一些人生感悟
    dispatch_get_main_queue 的同步异步问题
    虚拟机VirtualBox中Ubuntu无法全屏解决方法
    十大报错、报异常、跑不起来原因
    关于scrollbarfacecolor只支持ie的解决方法
    一个严肃的面试经验
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/9923526.html
Copyright © 2020-2023  润新知