Django filter 동적 필터링 및 정렬 구현 프로세스 분석

사전 준비
가상 개발 환경에 설치:
pip install django-filter
Django 프로젝트 프로필에 django_ 설치 및 구성filters 응용 프로그램:

INSTALLED_APPS = [
  ...
  'django_filters',
]

REST_FRAMEWORK = {
  #  
  'DEFAULT_FILTER_BACKENDS': (
      'django_filters.rest_framework.DjangoFilterBackend',),
}
빠른 사용
model.py

class User(models.Model):
  #  
  name = models.CharField(max_length=10, verbose_name=" ")
  sex = models.BooleanField(default=1, verbose_name=" ")
  age = models.IntegerField(verbose_name=" ")
  phone = models.CharField(max_length=20, null=True, verbose_name=" ")
  addr = models.CharField(max_length=100,null=True,verbose_name=" ")

  class Meta:
    db_table = "tb_user"
    verbose_name = " "
    verbose_name_plural = verbose_name
새 필터.py: 필터 클래스

import django_filters
from .models import User

class UserFilter(django_filters.FilterSet):

  class Meta:
    model = User
    fields = ["name", "age"] # , 
참고:
meta 필드 설명
모델: 인용된 모델, 문자열이 아닙니다
fields: 필터 필드를 가리키며 목록, 목록에서 사전은 필터할 수 있고 기본값은 판등입니다.사전도 할 수 있고, 사전은 사용자 정의 조작도 할 수 있다
exclude = ['password'] 필드를 제외하고, 목록에 있는 사전을 사용하여 필터링할 수 없습니다.
view.py

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.generics import ListAPIView
from rest_framework import filters
class UserViewSet(ListAPIView):
  queryset = User.objects.all()  # 
  serializer_class = UserModelSerializer # 
  filter_class = UserFilter  #  
serializers.py

from rest_framework import serializers
from .models import User
class UserModelSerializer(serializers.ModelSerializer):
  class Meta:
    model = User
    fields = "__all__"
urls.py
path('user/',UserViewSet.as_view()),
먼저 위의 동적 필터를 이해하고 앞부분은 요청 헤더에 다음과 같이 매개 변수를 전달합니다. 매개 변수의 개수는 다르고 동적 필터는 매개 변수가 있고 매개 변수의 값이 있는 항목만 필터합니다.
http://ip:port/user/?name=내용 찾기 & age = 내용 찾기
http://ip:port/user/?name=&age=내용 찾기
http://ip:port/user/?name=내용 찾기 & age=
http://ip:port/user/?name=&age=
http://ip:port/user/
정밀 여과, 모호 여과 병존

class UserFilter(django_filters.FilterSet):
  class Meta:
    model = User
    # fields = ["name", "age"]
    fields = {
      "name": ['exact','icontains'],
      "age": ['exact'],
    }
exact: 기본 필터 방식, 정확한 필터
icontains: 모호 필터
http://ip:port/user/?name=내용 찾기 &name_icontains=내용 찾기 &age=내용 찾기
범위 필터링

class UserFilter(django_filters.FilterSet):
  class Meta:
    model = User
    # fields = ["name", "age"]
    fields = {
      "name": ['exact','icontains'],
      "age": ['exact','gte','lte'],
    }
이상 filter에게
name 정밀 검색
name__icontains 모호 찾기
age 정밀 검색
age__gte 이상
age__lte 이하
정렬

class UserFilter(django_filters.FilterSet):
  # : 
  sort = django_filters.OrderingFilter(fields=('age',))
  class Meta:
    model = User
    # fields = ["name", "age"]
    fields = {
      "name": ['exact','icontains'],
      "age": ['exact','gte','lte'],
    }
url 예제
http://ip:port/user/?name=내용 찾기 &sort=age: 오름차순 표시
http://ip:port/user/?name=내용 찾기 &sort=-age: 내림 순서 표시
보충 지식
이 부분은 참고할 수 있습니다https://zhuanlan.zhihu.com/p/110060840
필터는 필터 필드를 사용자 정의할 수 있습니다. 처음에 필터 필드를 정의할 수 있습니다. 그리고 모든 필드가 같은 연산, 모호한 일치, 범위 조회인지를 정의할 수 있습니다. 그러나 이러한 쓰기는 직관적이지 않을 수 있습니다.
fields = {
"name": ['exact','icontains'],
"age": ['exact','gte','lte'],
}
우리는 다음과 같은 유형의 변화를 할 수 있다

class BookFilter(filters.FilterSet):
  btitle = filters.CharFilter(field_name='title',lookup_expr='icontains')
  pub_year = filters.CharFilter(field_name='bpub_date',lookup_expr='year')
  pub_year__gt = filters.CharFilter(field_name='bpub_date',lookup_expr='year__gt')
  bread__gt = filters.NumberFilter(field_name='bread',lookup_expr="gt")
  bread__lt = filters.NumberFilter(field_name='bread',lookup_expr="lt")

  class Meta:
    model = Bookinfo
    fields = ['title','bread','bcomment']
http://127.0.0.1:8000/book/?title=&bread=&bcomment=&btitle=%E5%B0%84%E9%9B%95&pub_year=&pub_year__gt=&bread__gt=&bread__lt=
필터 각 필드 내부 구성:
field_name: 필터 필드 이름, 모델에 대응하는 필드 이름
lookup_expr: 조회할 때 해야 할 작업은 등치, 범위, 모호 일치 등
필터 필드 유형:
CharFilter 문자열 유형
BooleanFilter 부울 유형
DateTimeFilter 날짜 시간 유형
DateFilter 날짜 유형
DateRangeFilter 날짜 범위
TimeFilter 시간 유형
NumberFilter 수치 유형, 대응 모델 중 IntegerField, FloatField, DecimalField
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기