Day 26 频率类型使用
配置信息查找顺序
- 局部配置(优先) 局部配置优先走局部配置
- 全局配置(次优先) 全局没有配置走默认配置
- 默认配置(最后) 全局都没有配置就走默认配置
一、表中choice字段的使用
choice接收一个元组(保证值不可变),同理每一个选项也是由一个元组**(value,display_name)**构成。显而易见,display_name就是要在页面中展示的。
class Book(models.Model):
name = models.CharField(max_length=32)
author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
category = models.CharField(max_length=32, choices=(('1', '历史'), ('2', '政治'), ('3', '语文')))
默认情况下,我们的 category 字段只会显示 元组中的第一个 类型 也就是 字符串的 1,2,3
{
"id": 1,
"name": "python",
"category": "1",
"author": 1
},
如果我们想要拿到与之对应的值也就是 “历史”,“政治”,"语文"等…就要用到他给我们自动生成(数据库迁移后就可以直接使用!)的办法 get_category_display
那么我们就可以在序列化器中 使用这个方法了
class BookSerializer(serializers.ModelSerializer):
category = serializers.CharField(source='get_category_display')
class Meta:
model = models.Book
fields = "__all__"
depth = 1
{
"id": 1,
"category": "历史",
"name": "python",
"author": {
"id": 1,
"name": "李二狗",
"address": "南湖大道"
}
},
二、多种视图的使用
三、频率的使用
1、自定义频率类
2、内置评率类的使用
2.1.1 局部使用
在视图类中添加 throttle_class 属性
throttle_classes = [auth.MyThrottle,]
2.1.2 全局使用
在settings中配置REST_FRAMEWORD = { } 并添加默认评率类键值对
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES':['app01.MyThrottle.MyThrottle',],
}
2.2 扩展内置频率类
- BaseThrottle:基类
- SimpleRateThrottle:咱么自定义扩写它
- AnonRateThrottle:限制匿名用户的访问次数,通过IP地址区分用户
- ScopedRateThrottle:限制用于对于每个视图的访问频次,通过ip地址或者useid来区分
- UserRateThrottle:限制登录用户访问次数
后面三个是他内置的访问频次限制,前面是给我们用来拓展的。
2.3 扩展内置频率类
from rest_framework.throttling import SimpleRateThrottle
class MyThrottle(SimpleRateThrottle):
scope = '外比巴卜'
def get_cache_key(self, request, view):
return self.get_ident(request) # 通过id限制
然后我们在setting中配置下
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': ['app01.MyThrottle.MyThrottle', ],
'DEFAULT_THROTTLE_RATES': {'外比巴卜': '5/m'} # key 与我们之前定义scope对应 value 是 次数/天/分/秒
}
2.4 阅读源码
五、内置,第三方过滤功能(次重点)
1、 过滤
对于列表数据根据字段进行过滤
内置筛选器的使用
-
在视图类中配置
class BookView(GenericAPIView, ListModelMixin): queryset = Book.objects serializer_class = BookSerializer filter_backends = [SearchFilter] search_fields = ('name','id') # 模型表中存在的字段 def get(self, request, *args, **kwargs): return self.list(request, *args, **kwargs)
执行流程—>SearchFilter类—>get_search_fields—>must_call_distinct
查询方法
继承的方法默认是模糊查询,有相关内容的都会被查询出来!
http://127.0.0.1:8000/books/?search=1
第三方扩展的过滤功能
pip install django-filter
最新版本的 django-filter
是要跟 django2.2
以上搭配的,如果不是 他会默认将 django
版本装到最新
我们需要自己换回来 找到适合自己的 django-filter
版本
class BookView(GenericViewSet, ListModelMixin, CreateModelMixin):
queryset = Book.objects
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend, ]
filter_fields = ('name', 'id') # 这里的字段不一样了 以前是search_fields
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
搜索也变得简单
127.0.0.1:8000/book/?name=雪山飞狐&id=3
这个不是模糊模式,关键字时查不出来的。
六、排序功能
1、 在视图类中配置
filter_backends =[OrderingFilter,] # 可以混合使用
ordering_fields=['id','age'] # 先按照id 再按照年龄排序
使用方法
127.0.0.1:8000/book/?ordering=-id
2、过滤后再排序
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
class BookView(GenericViewSet, ListModelMixin, CreateModelMixin):
queryset = Book.objects
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend, OrderingFilter] # 混合使用
filter_fields = ('name', 'id')
ordering_field = ('id', 'category')
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
使用
127.0.0.1:8000/book/?name=雪山飞狐&ordering=-id