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.pypath('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
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.