Django|Vue+Django 2.0.6 学习笔记 5.10 drf过滤

额 我之前竟然把10-11都漏掉了 难怪我看视频看到6.5就开始一脸懵逼

继续

class GoodsListViewset(mixins.ListModelMixin, viewsets.GenericViewSet): """ 商品列表页. """serializer_class = GoodsSerializer pagination_class = GoodsPagination# 也就这里的不同 将queryset那列放下来了 因为 GenericViewSet也是调用get_queryset函数来获取model的 def get_queryset(self): return Goods.objects.filter(shop_price__gt = 100)

这样可以过滤商品价格大于100元的数据
但是这样写太死板 可以这样写
def get_queryset(self): # 这个all()并不会获取大量数据 只是生成获取所有数据的sql命令 直到迭代的时候才会获取 queryset = Goods.objects.all() # price_min是前端获取的字段 price_min = self.request.query_params.get('price_min', 0) if price_min: queryset = queryset.filter(shop_price__gt = int(price_min))return queryset

效果:
Django|Vue+Django 2.0.6 学习笔记 5.10 drf过滤
文章图片

更进一步 使用 filtering:
DjangoFilterBackend
SearchFilter
OrderingFilter
先安装 django-filter
然后添加
INSTALLED_APPS = ['django_filters']

views.py:
from django_filters.rest_framework import DjangoFilterBackendclass GoodsListViewset(mixins.ListModelMixin, viewsets.GenericViewSet): """ 商品列表页. """ # get_queryset函数就不用了 queryset = Goods.objects.all().order_by('id') serializer_class = GoodsSerializer pagination_class = GoodsPagination filter_backends = (DjangoFilterBackend,) filter_fields = ('name', 'shop_price')

效果:
Django|Vue+Django 2.0.6 学习笔记 5.10 drf过滤
文章图片

点击后:
Django|Vue+Django 2.0.6 学习笔记 5.10 drf过滤
文章图片

Django|Vue+Django 2.0.6 学习笔记 5.10 drf过滤
文章图片

如果此过滤功能不满足 可以自定义一个filter文件和类
这样就完成数据过滤的功能

# filter.pyimport django_filtersfrom django.db.models import Qfrom .models import Goods# Django2.0 的继承类 class GoodsFilter(django_filters.rest_framework.FilterSet): """ 商品的过滤类 """# 这里要注意 2.0之后改成了field_name 而不是name price_min = django_filters.NumberFilter(field_name='shop_price', lookup_expr='gte') price_max = django_filters.NumberFilter(field_name='shop_price', lookup_expr='lte')class Meta: model = Goods fields = ['price_min','price_max']#views.pyfrom .filters import GoodsFilterclass GoodsListViewset(mixins.ListModelMixin, viewsets.GenericViewSet): """ 商品列表页. """queryset = Goods.objects.all().order_by('id') serializer_class = GoodsSerializer pagination_class = GoodsPagination filter_backends = (DjangoFilterBackend,) filter_class = GoodsFilter

【Django|Vue+Django 2.0.6 学习笔记 5.10 drf过滤】完结

    推荐阅读