本文共 2098 字,大约阅读时间需要 6 分钟。
额 我之前竟然把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
效果:
更进一步 使用 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')
效果:
点击后:
如果此过滤功能不满足 可以自定义一个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
完结
转载地址:http://jnepi.baihongyu.com/