首页 > 解决方案 > 如何在 Django Rest Framework 中为基于函数的视图添加过滤

问题描述

我正在尝试将过滤器添加到基于函数的视图中。使用基于类的视图,我能够向视图添加过滤器。但我很好奇是否可以向基于此功能的视图添加过滤。我需要通过网络搜索按其名称过滤主题。我怎样才能做到这一点

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def TeacherSubject(request):
    teacher = TeacherProfile.objects.get(user=request.user)
    subject = Subject.objects.filter(author=teacher).order_by('-id')
    paginator = PageNumberPagination()
    paginator.page_size = 5
    result_page = paginator.paginate_queryset(subject, request)
    serializer = SubjectSerializer(result_page,many=True)
    return paginator.get_paginated_response(serializer.data)

标签: pythondjangodjango-rest-framework

解决方案


您可以使用django-filter。例如

# filters.py

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

# views.py
...
from .filters import ProductFilter


@api_view(['GET'])
@permission_classes([IsAuthenticated])
def product_list(request):
    queryset = Product.objects.all()
    filterset = ProductFilter(request.GET, queryset=queryset)
    if filterset.is_valid():
         queryset = filterset.qs
    serializer = ProductSerializer(queryset, many=True)
    return Response(serializer.data)

如果您需要引发验证错误,请使用此

from .filters import ProductFilter
from django_filters.utils import translate_validation

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def product_list(request):
    filterset = ProductFilter(request.GET, queryset=Product.objects.all())
    if not filterset.is_valid():
         raise translate_validation(filterset.errors)
    serializer = ProductSerializer(filterset.qs, many=True)
    return Response(serializer.data)

分页

from .filters import ProductFilter
from django_filters.utils import translate_validation
from rest_framework.pagination import PageNumberPagination

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def product_list(request):
    paginator = PageNumberPagination()
    paginator.page_size = 5
    
    filterset = ProductFilter(request.GET, queryset=Product.objects.all())
    if not filterset.is_valid():
         raise translate_validation(filterset.errors)

    queryset = paginator.paginate_queryset(filterset.qs, request)
    serializer = ProductSerializer(queryset, many=True)
    return paginator.get_paginated_response(serializer.data)

推荐阅读