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

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

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

接下来按照我的思想填补代码,读取文件头,读到SYS / # / OBS TYPES时,读取并记录每个系统,以及后边跟的总的观测类型数,以及再后边的具体的观测类型。要求是读取的系统频率是GPS L1(1575.42 MHz)L2(1227.60 MHz),GLONASS G1(1602+k*9/16)G2(1246+k*7/16),BDS B1(L2,1561.098 MHz)B3(L6,1268.52 MHz),Galileo E1(L1,1575.42 MHz)E5a(L5,1176.45 MHz);分别对应的观测类型中间的数字是GPS:1、2;GLONASS:1、2;BDS:1、6;Galileo:1、5;依照此分别筛选数据块中的读取的观测数值。同时如果某一类型频率有多个值,也就是观测类型第一个字母第二个数字都一样,就看第三个字母,也就是跟踪类型,其中系统频率要求为对于GPS L1L2,分别按跟踪模式"CSLXPWYM""CDSLXPWYM"优先级选用观测值;对于GLONASS G1G2,按跟踪模式"CP"优先级选用观测值;对于BDS B1B3,按跟踪模式"IQX"优先级选用观测值;对于GAL E1E5a,分别按跟踪模式"ABCXZ""IQX"优先级选用观测值;定义右边优先级高于左边;依照要求对观测类型优先级顺序进行排序,方便后边数据的读取显示。然后文件头的其他就没用了,可以选择性记录,知道文件末尾END OF HEADER结束。开始读取数据块部分,这部分可以先通过读取记录每行首字符">"进行历元计算,算出总共几个历元,应该是从0小时到23小时,完整一天,然后循环,循环内开始读取第一行数据,提取第一行的时间,状态(0或者1)以及该历元下卫星数,再次内循环卫星数,读取下一行的卫星prn以及观测数据,与文件头读取的卫星类型进行对应,知道后边的观测类型,对应伪距,载波,多普勒,信噪比,可以先将该卫星下的一行的所有观测值进行对应,看看是否对应的上文件头的观测类型,如果一行有数据的部分正好符合观测类型数量,就不用算空格,如果少了就算上空格。主要就是看一下是否包含空格。然后根据优先级进行提取,选择优先级最高的显示。每个频率以及对应的观测类型都是由表头读取的一一对应的,一定要注意。然后依次循环,最后只输出整点历元的时刻,也就是分钟秒数都为0的时刻。输出时依照时间,系统,卫星,两个频率的伪距,载波,多普勒,信噪比跟踪模式进行逐行输出整点时刻的观测信息。并且观测值均采用小数输出,小数点保留4位,不少于原始数据小数位。注意根据官网RINEX3.04版本观测文件说明书对应数据的列宽。要读取的文件是RINEX3.04版本的观测文件,路径为"D:\qq\jfng1590.24o",输出结果保存路径为"D:\qq\output_obs.txt",最好不要用类来写,用能在Visual Studio 2022运行的C++代码写完整代码。一定要读取文件完整一天的整点时刻,即从0点到23点,最终输出结果类似如下:Time,System,Satellite,Frequency,PR,CP,DP,SN,TR 2024-06-07 00:00:00.0000,C,C01,B1,37450019.4140,195012125.9830,40.6910,40.9000,I 2024-06-07 00:00:00.0000,C,C01,B3,37450014.6840,158463326.6060,33.0660,41.9000,I 2024-06-07 00:00:00.0000,E,E04,E1,28372554.6330,149098714.9830,-1910.6640,29.5000,X 2024-06-07 00:00:00.0000,E,E04,E5a,0.0000,0.0000,0.0000,0.0000,- ...记得按照依次输出时间,系统,卫星,两个频率的伪距、载波、多普勒、信噪比跟踪模式;这样的顺序来
10-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值