额 我之前竟然把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 DjangoFilterBackend
class 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.py
import django_filters
from django.db.models import Q
from .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.py
from .filters import GoodsFilter
class GoodsListViewset(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
商品列表页.
"""
queryset = Goods.objects.all().order_by('id')
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
filter_backends = (DjangoFilterBackend,)
filter_class = GoodsFilter
完结