Nav*_*iti 1 python django 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)
Run Code Online (Sandbox Code Playgroud)
您可以使用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)
Run Code Online (Sandbox Code Playgroud)
如果您需要引发验证错误,请使用此
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)
Run Code Online (Sandbox Code Playgroud)
分页
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)
Run Code Online (Sandbox Code Playgroud)