python - 如何在 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)
解决方案
您可以使用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)
推荐阅读
- angular - 容器大小更改时打开图层地图重新加载
- sql - 查询以包括第一条记录和最后一条记录以仅显示一个输出
- javascript - 可以通过命令运行应用程序的 Discord 机器人
- python - AttributeError:“动物”对象没有属性“get_name”
- javascript - 提高 javascript 中多字符串搜索的性能
- powershell - 无法从 Powershell API 访问来自 Invoke-RestMethod 的数据
- python - Python:查找 substring1,如果不存在则查找 substring2
- java - 记忆最长升序子序列递归
- swift - macOS - 通过 UI 视图传递信息时出错
- java - 尝试在 Java 中创建消失的正方形