Day 26 频率类型使用和排序过滤

本文介绍Django REST framework中配置信息的查找顺序、表字段choice的使用、频率限制的配置及内置与第三方过滤功能,帮助读者掌握核心配置技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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', '语文')))

image-20201111152513734

默认情况下,我们的 category 字段只会显示 元组中的第一个 类型 也就是 字符串的 1,2,3

 {
        "id": 1,
        "name": "python",
        "category": "1",
        "author": 1
    },

如果我们想要拿到与之对应的值也就是 “历史”,“政治”,"语文"等…就要用到他给我们自动生成(数据库迁移后就可以直接使用!)的办法 get_category_display

image-20201111154550310

那么我们就可以在序列化器中 使用这个方法了

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 是 次数/天/分/秒
}

image-20201111162402993

2.4 阅读源码

image-20201111171920359

五、内置,第三方过滤功能(次重点)

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

    image-20201111190649135

第三方扩展的过滤功能

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

image-20201111195007187

这个不是模糊模式,关键字时查不出来的。

六、排序功能

1、 在视图类中配置

filter_backends =[OrderingFilter,]  # 可以混合使用
ordering_fields=['id','age']  # 先按照id 再按照年龄排序

使用方法

127.0.0.1:8000/book/?ordering=-id

image-20201111195714377

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

image-20201111200059773

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值