博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue+Django 2.0.6 学习笔记 5.10 drf过滤
阅读量:4127 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
第四章 - 程序计数器
查看>>
第七章 - 本地方法栈
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
一篇搞懂Java反射机制
查看>>
MySQL主从复制不一致的原因以及解决方法
查看>>
RedisTemplate的key默认序列化器问题
查看>>
序列化与自定义序列化
查看>>
ThreadLocal
查看>>
从Executor接口设计看设计模式之最少知识法则
查看>>
OKhttp之Call接口
查看>>
application/x-www-form-urlencoded、multipart/form-data、text/plain
查看>>
关于Content-Length
查看>>
WebRequest post读取源码
查看>>
使用TcpClient可避免HttpWebRequest的常见错误
查看>>
EntityFramework 学习之一 —— 模型概述与环境搭建 .
查看>>
C# 发HTTP请求
查看>>
启动 LocalDB 和连接到 LocalDB
查看>>
Palindrome Number --回文整数
查看>>
Reverse Integer--反转整数
查看>>