ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django django-filter] FilterSet Guide
    언어/파이썬 & 장고 2016. 9. 26. 15:50

    Meta Options

    Automatic filter generation with model

    FilterSet은 주어진 model의 필드를 위해 자동적으로 필터를 생성 할 수있습니다. 장고의 ModelForm과 마찬가지로, 필터는 기본 모델 필드의 유형에 따라 생성됩니다. 이 옵션은 장고의 ModelForm클래스에서 같은 requirement가 있는 fields나 exclude 옵션 중 하나와 결합되어야 합니다. 자세한 사항은 here 있습니다.

    class UserFilter(django_filters.FilterSet):
        class Meta:
            model = User
            fields = ['username', 'last_login']

    Declaring filterable fields

    fields 옵션은 자동으로 필터를 생성하는 model과 결합됩니다. 주목할 것은 생성 된 필터가 FilterSet에서 선언된 필터를 override하지 않습니다. fields 옵션은 다음 두 구문을 허용합니다.

    • 필드 이름 list
    • 조회 list와 매핑되는 필드 이름의 dictionary
    class UserFilter(django_filters.FilterSet):
        class Meta:
            model = User
            fields = ['username', 'last_login']
    
    # or
    
    class UserFilter(django_filters.FilterSet):
        class Meta:
            model = User
            fields = {
                'username': ['exact', 'contains'],
                'last_login': ['exact', 'year__gt'],
            }

    list 구문은 fields에 포함된 각 필드에 대해서 exact 조회 필터를 생성합니다. dictionary 구문은 해당하는 모델 필드에 선언 된 각 조회 표현식에 대한 필터를 생성합니다. 이 표현은 변환과 조회 둘다 포함 하고 자세한 사항은 lookup reference에서 확인할 수 있습니다.

    Disable filter fields with exclude

    exclude 옵션은 자동 필터 생성에서 제외 할 필드 이름의 블랙리스트를 받아들입니다. 주목할 것은 이 옵션은 FilterSet에서 직접 선언된 필터를 비활성화 하지 않습니다.

    class UserFilter(django_filters.FilterSet):
        class Meta:
            model = User
            exclude = ['password']

    Ordering using order_by

    사용자는 사용자가 order_by argument를 제공해 정렬을 하도록 제공할 수 있습니다. order_by는 옵션이 존재하는 경우 필드 이름의 list 나 tuple 중 하나가 될 수있습니다. 또는  bool일 경우 만약 true라면, 사용자가 필터링 할 수 있는 모든 필드는 정렬할 수 있음을 나타냅니다.

    import django_filters
    
    class ProductFilter(django_filters.FilterSet):
        price = django_filters.NumberFilter(lookup_expr='lt')
        class Meta:
            model = Product
            fields = ['price', 'release_date']
            order_by = ['price']

    만약 order_by 내에 있는 아이템의 보여지는 것을 제어하려면 사용자는 list 또는 (field_name, display_name)형식인 2-tuple로 설정할 수 있습니다. 이것은 사용자가 순서 필드에 대한 표시 이름을 재정의 할 수 있습니다 :

    order_by = (
        ('name', 'Company Name'),
        ('average_rating', 'Stars'),
    )


    주목할 것은 순서에 사용되는 기본 쿼리 매개 변수의 이름은 o 입니다. 사용자가 사용하고자하는 문자열 값으로 FilterSet 클래스에 order_by_field 속성을 설정함으로써 이를 override 할 수 있습니다.

    Custom Forms using form

    내부 Meta 클래스는 선택적인 form argument를 받습니다. FilterSet.form는 서브 클래스 할에서 양식 클래스입니다.
    이것은 ModelAdmin의 form 옵션과 비슷 작동합니다.

    Group fields with together

    내부 Meta 클래스는 선택 together argument를 사용합니다. 이것은 각 필드 이름이 포함된 리스트의 list입니다. 단일 필드의 집합을 처리 할 때 단일 list/tuple 필드가 편리할 수 있습니다. 필드 집합 내의 필드들은 유효한 FilterSet.form에 대한 요청이 모두 표현되거나 모두 표현되면 안됩니다.

    import django_filters
    
    class ProductFilter(django_filters.FilterSet):
        class Meta:
            model = Product
            fields = ['price', 'release_date', 'rating']
            together = ['rating', 'price']

    Non-Meta options

    -------------

    Overriding FilterSet methods

    ---------------



    참조문서: https://django-filter.readthedocs.io/en/latest/ref/filterset.html#model

    댓글