【DRF】序列化器ModelSerializer的使用

2023-11-02

不使用序列化器的过程

1. 把前端发送请求过来的json字符串,通过json.loads转换成字典,字典转换为Python对象,存在数据库
2. 返回给前端数据,是把对象查询出来,转换成字典,再通过JsonResponse转换为json字符串

序列化器介绍

1. 序列化输出:序列化器把模型对象(qs)转换成字典,经过response变成json字符串给前端 `对象->字典->json`
2. 反序列化输入:把前端请求过来的数据,经过request以后变成字典(data),序列化器把字典转成模型存到数据库中,反序列化完成数据校验功能,前端传入的数据是否合法,长度校验等 `json->字典->对象`

Serializer序列化器使用方式

1.必须得继承Serializer类或者Serializer子类
2.定义的序列化器类中的字段名称“必须”与模型类中的字段名保持一致
3.默认定义哪些字段,那么哪些字段就会序列化输出,同时这些字段也必须输入(传递)
4.序列化器中定义的字段必须为Field子类
  CharField 字符串类型
  IntegerField  int类型
  BooleanField 布尔类型
  DataTimeField 日期类型
5.CharField可以指定max_length、min_length

通用参数

参数名称 说明
label 用于HTML展示API页面时,显示的字段名称
help_text 用于HTML展示API页面时,显示的字段帮助提示信息
write_only =True,该字段前端必须输入,但不需要输出,请求完之后不会返回这个字段
read_only =True,该字段前端不需要输入,但是需要输出,请求完之后会返回这个字段
required =True, 指定该字段反序列化输入时,必须传递
allow_null =True 该字段可以传空值 null 不可以不传
allow_blank =True 可以传空字符串
default 指定该字段的默认值,会将默认值做为反序列化的输入值

Serializer的使用

模型类

 class Book(models.Model):
     name = models.CharField(max_length=32)
     price = models.DecimalField(decimal_places=2, max_digits=5)
     author = models.CharField(max_length=32)

序列化类

from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.Serializer):
	name = serializers.CharField(max_length=8, min_length=3)
	price=serializers.CharField() # models中使用了DecimalField,这个位置使用了CharField会把小数类型转成字符串
    author = serializers.CharField()

视图类
序列化输出

class BookView(APIView):
   def get(self,request):
       """先从数据库查询出要所有数据"""
       book_list=Book.objects.all()
       """使用serializers里定义的序列化器对库里查出来的数据进行序列化,instance: 要序列化的对象,就是从库里查出来的数据
       many: 如果是查询集对象,many=True;如果是单个对象,many=False""" 
       ser=BookSerializer(instance=book_list,many=True)  # 传入初始化的参数instance=None, data=empty
       """将序列化后的数据返回给前端,serializer.data序列化后是字典"""
       return Response(ser.data) 

反序列化输入-新增
序列化类

from rest_framework import serializers
from .models import Book


class BookSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=8, min_length=3)
    price=serializers.CharField()
    author = serializers.CharField()
    price_info=serializers.CharField(read_only=True) 

    def create(self, validated_data):
        # validated_data校验过后的数据
        # 手动存到book表中
        book=Book.objects.create(**validated_data)
        # book=Book.objects.create(name=validated_data.get('name'))
        return book  # 不要忘记返回book对象

视图类

第一步:把前端传入的数据,放到Serializer对象中:ser=BookSerializer(data=request.data)
第二步:校验数据:ser.is_valid():
第三步:保存,ser.save()---》必须重写create,在序列化类中
     def create(self, validated_data):
        book=Book.objects.create(**validated_data)
        return book
class BookView(APIView):
    def post(self,request):
        """获取前端传过来的数据,字典格式传入data进行反序列化,创建序列化器对象"""
        ser=BookSerializer(data=request.data) 
        """校验前端传来的数据"""
        if ser.is_valid():  # 如果是true表示数据校验通过,通过,就保存
            # 如果instance为None,调用save本质会调用create--》父类create直接抛异常,所以我们要重写
            # 序列化器对象调用save方法时,会调用序列化器类中的create方法,进行数据创建操作
            ser.save()  #就会保存,重写create方法,如果不重写,我们不知道存到哪个表中,前提是使用的serializer,不是modelserializer
            return Response(ser.data)
        return Response({'code':101,'msg':'数据校验失败','err':ser.errors})

反序列化输入-修改
序列化类

class BookSerializer(serializers.Serializer):
    id = serializers.CharField(read_only=True)
    name = serializers.CharField(max_length=8, min_length=3)
    price = serializers.CharField(required=False) 
    author = serializers.CharField(required=False)

    def create(self, validated_data):
        # validated_data校验过后的数据
        # 手动存到book表中
        book = Book.objects.create(**validated_data)
        # book=Book.objects.create(name=validated_data.get('name'))
        return book  # 不要忘记返回book对象

    def update(self, instance, validated_data):
        # validated_data校验过后的数据,instance 是要修改的对象
        instance.name = validated_data.get('name')
        instance.price = validated_data.get('price')
        instance.author = validated_data.get('author')
        instance.save()  # 模型对象自带的save,保存到数据库中
        return instance  # 要忘记返回instance对象

视图类

 class BookDetailView(APIView):
     def get(self, request, pk):
         book = Book.objects.filter(pk=pk).first()
         ser = BookSerializer(instance=book)  # 如果是单条记录,many不传,就是false
         return Response(ser.data)

     def delete(self, request, pk):
         res = Book.objects.filter(pk=pk).delete()
         print(res)
         if res[0] > 0:
             return Response({'code': 100, 'msg': '删除成功'})
         else:
             return Response({'code': 103, 'msg': '数据不存在'})

     def put(self, request, pk):
         # 修改:用什么数据,修改哪个对象?
         book = Book.objects.filter(pk=pk).first()
         # 既有instance,又有data,表示修改
         ser = BookSerializer(instance=book, data=request.data)
         if ser.is_valid():
             # 重写update方法
             ser.save()  # 调用save---》内部根据instance判断是触发create还是update
             return Response(ser.data)
         return Response({'code': 102, 'msg': '修改出错', 'err': ser.errors})

一些校验

校验规则的顺序
调用父类的to_internal_value方法-》校验字段类型CharField-》通用的约束参数(max_length、min_length)-》依次校验validators中指定的校验规则 -》进入到序列化器类中调用单字段validate_XXX的校验方法-》多字段validate联合校验方法-》父类的to_internal_value方法调用结束-》进入到序列化器类中调用多字段的联合方法

to_internal_value

1.在序列化器类进行校验时,首先会调用`to_internal_value`方法,开始进行校验
2.是在所有反序列化输入开始之前会调用的一个方法,比如前端传来的数据不符合要求,可以在这里进行裁剪之后再用
# 将前端传来的字段进行大写
def to_internal_value(self, data):
    some_data = super().to_internal_value(data)
    some_data['leader']=some_data['leader'].upper() # 在中间进行数据的处理
    return super().to_internal_value(data) # 返回的是处理之前的数据
    return some_data # 可以返回处理之后的数据

validators

1.可以在序列化器字段上使用validators指定自定义校验器
2.validators 必须得指定为序列类型(往往为列表),在列表中可以添加多个校验器
3.UniqueValidator,校验器进行唯一约束的校验,必须得指定queryset参数,使用message指定具体报错信息
name = serializers.CharField(label='项目名称', help_text='项目名称', write_only=True, max_length=10, min_length=3,error_messages={'min_length': '项目名称不能少于3位'},
         validators=[UniqueValidator(queryset=Projects.objects.all(), message='项目名称不能重复')])

自定义校验

1.可以在类外面自定义校验函数
2.第一个参数为待校验的值
3.如果校验不通过,必须得抛出serializers.ValidationError(‘报错信息’)异常,同时可以指定具体得报错信息
4.需要将校验函数名放置到某一个字段的 validators列表中(不加括号)
def is_contain_keyword(value):

    if '项目' not in value:
        # 如果校验失败,必须得返回ValidationError异常对象
        # 第一个参数可以指定具体报错信息
        raise serializers.ValidationError('项目名称中必须得包含“项目”关键字')

单字段校验 validate_待校验的字段名

1.可以在序列化器类中定义对单字段进行校验的方法
2.但字段的校验方法名称,必须把validate_作为前缀,加上待校验得字段名,如:validate_待校验的字段名
3.接收的参数为前端传递的值
4.如果校验不通过必须得返回serializers.ValidationError(‘具体得报错信息’)
5.如果校验通过,往往将校验之后得值返回
6.必须返回value
def validate_name(self, value):

    if not value.endswith('项目'):
        raise serializers.ValidationError('项目名称必须以"项目"结尾')
    return value

多字段联合校验 validate

1.validate 用于多个字段的联合校验,使用固定得validate方法,会接收上面校验通过之后的字典数据
2.接收的参数attrs为前端传递的所有参数(当字段均以校验通过)
3.当所有字段定义时添加的校验规则都通过,并且每个字典得单字段校验通过得情况下,才会调用validate方法
4.如果在单字段的校验方法中校验不通过,那么不会调用validate
5.如果校验不通过,必须得返回ValidationError异常对象
6.如果校验通过,那么一般需要将校验之后的值返回
7.必须返回attrs
def validate(self, attrs):
    name = attrs.get('name')
    leader = attrs.get('leader')
    if len(name + leader) > 10:
        raise serializers.ValidationError('项目名称与项目负责人名称总长度不超过10个字节')
    return attrs

ModelSerializer

1.可以继承ModelSerializer,根据模型类来自动生成序列化器类中的字段
2.必须得指定model参数(模型类),用于指定使用的模型
3.会实现create、update方法
4.会给主键字段、DataTimeField(指定auto_now_add和auto_now参数),会添加read_only=True
5.会给有指定default参数的字段,添加required=False
6.会给有指定null参数的字段,添加allow_null=True
7.会给有指定blank参数的字段,添加allow_blank=True
8.在Meta元信息中,fields指定模型类中需要进行序列化操作的字段
     a.'__all__',指定模型类中所有的字段都需要进行序列化操作
     b.可以指定模型类中序列化操作的字段,需要在元组中指定
     c.exclude指定不需要进行序列化操作的字段
     d.如果指定了模型类中没有定义的字段,那么必须在fields元组中指定,如果fields为'__all__'或者exclude除外
class ProjectModelSerializer(serializers.ModelSerializer):

    def validate_name(self, value):
        value: str
        if not value.endswith('项目'):
            raise serializers.ValidationError('项目名称必须得以“项目”结尾')
        return value

    token = serializers.CharField(read_only=True)
    email = serializers.EmailField()

    def create(self, validated_data:dict):
        email = validated_data.pop('email')
        obj = Projects.objects.create(**validated_data)
        obj.token = '1234'
        obj.email = '123@qq.com'
        return obj

    class Meta:

        model = Projects
        fields = '__all__'  # 返回所有的序列化字段
        #fields = ('id','name', 'token', 'email') # 返回元组里写的字段
        #exclude = ('create_time', 'update_time', 'is_execute') # 返回除了元组里写的字段之外的所有字段
        """
        可以在Meta内部类的read_only_fields,统一指定需要添加read_only=True的字段
        只读的话,可以不传值
        """
       
        read_only_fields = ('is_execute','desc')
        
        """
         a.可以在Meta内部类的extra_kwargs中对自动生成的序列化字段进行修改
         b.将需要修改的字段名作为key,具体修改的内容作为value
        """
        extra_kwargs = {
            'name': {
                'label': '项目名称',
                'max_length': 10,
                'min_length': 3,
                'error_messages': {
                    'min_length': '项目名称不能少于3位',
                    'max_length': '项目名称不能超过10位'
                },
                'validators': [
                    UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复')
                ],

            },
            'create_time':{
                'format' : '%Y年%m月%d日 %H:%M'
            },
            'update_time':{
                'format': '%Y年%m月%d日 %H:%M'
            }

        }

Serializer序列化关系模型

模型表

class Publish(models.Model):
    """出版社表"""
    name = models.CharField(max_length=32,verbose_name='出版社名称')
    address = models.CharField(max_length=64,verbose_name='出版社地址')

    def __str__(self):
        return self.name

class Book(models.Model):
    """图书表"""
    title = models.CharField(max_length=32,verbose_name='书名')
    price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='书的价格')
    publish_time = models.DateTimeField(auto_now_add=True,verbose_name='出版日期')

    # 创建书籍与出版社的一对多外键字段,外键写在多的一方
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)

    # 创建书籍与作者的多对多外键字段
    authors = models.ManyToManyField(to='Author')

    def __str__(self):
        return self.title

StringRelatedField

1. 用于在序列化输出时,调用关联表模型类中的__str__方法
2. 默认添加了read_only=True,只用于序列化输出,而不会反序列化输入

多对一关系中,在一的一方显示多的一方的数据,需要在一的一方加字段,如果从表没有写‘related_name=xxx’就使用‘从表名_set’

from rest_framework import serializers
from books.models import Book,Publish,Author,AuthorDetail

class BookModelSerializer(serializers.ModelSerializer):


    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):

    book_set = serializers.StringRelatedField(many=True)

    class Meta:
        model = Publish
        fields = ['id','name','address','book_set']

在这里插入图片描述

多对一关系中,在多的一方显示一的一方的数据,需要在多的一方加字段,使用外键的名字,数据库里这个外键需要设置null=True,否则前端需要输入,会有问题

from rest_framework import serializers
from books.models import Book,Publish,Author,AuthorDetail


class BookModelSerializer(serializers.ModelSerializer):

    publish = serializers.StringRelatedField()

    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Publish
        fields = ['id','name','address','book_set']

没有加StringRelatedField的时候,返回的是id,加了之后,返回的是__str__里的值
在这里插入图片描述
在这里插入图片描述

PrimaryKeyRelatedField

1.父表模型对象获取从表的数据,默认使用从表模型类名小写_set
2.如果想修改默认的从表名,需要在从表models外键那里设置related_name='interfaces'
3.如果输出有多条结果,是个列表的话需要加many=True
4.在父表序列化器中可以手动指定关联字段的序列化类型
  PrimaryKeyRelatedField,指定从表的主键id值
  PrimaryKeyRelatedField,指定read_only=True,那么只输出从表外键id
  PrimaryKeyRelatedField,未指定read_only=True或者required=False,需要反序列化输入的话,需要queryset=Interfaces.objects.all()

多对一关系中,在一的一方查多的一方的数据,需要在一的一方加字段,用多的一方的表名_set

class BookModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):

    book_set = serializers.PrimaryKeyRelatedField(read_only=True,many=True)


    class Meta:
        model = Publish
        fields = '__all__'

返回的是关联字段的id值,需要指定read_only = True
在这里插入图片描述

class BookModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):

    book_set = serializers.PrimaryKeyRelatedField(many=True,queryset=Book.objects.all())


    class Meta:
        model = Publish
        fields = '__all__'

展示的是关联字段的id值,需要指定query,可以反序列化输入
在这里插入图片描述
多对一关系中,在多的一方查一的一方的数据,需要在多的一方加字段,用多的一方里的外键字段

class BookModelSerializer(serializers.ModelSerializer):

    publish = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Publish
        fields = '__all__'

返回关联属性的主键,设置属性为read_only=True表示修改时,即使传过来的有id,也不做修改,保留原始的值!
在这里插入图片描述

class BookModelSerializer(serializers.ModelSerializer):

    publish = serializers.PrimaryKeyRelatedField(queryset=Publish.objects.all())

    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):


    class Meta:
        model = Publish
        fields = '__all__'

返回关联属性的主键,设置属性为查询集,表示修改时,当你要修改时,如果查询集有,可以修改,如果没有,不可以修改!
在这里插入图片描述

SlugRelatedField

1.SlugRelatedField,用于在序列化输出或者反序列化输入时指定使用的关联模型类中的字段名
2.如果未指定read_only=True或者required=False,需要反序列化输入的话,需要queryset=Interfaces.objects.all()(指定校验时使用的查询集对象)
3.如果需要反序列化输入,那么slug_field必须得指定拥有唯一约束的字段名

多对一关系中,在一的一方查多的一方的数据,需要在一的一方加字段,用多的一方的表名_set

class BookModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):

    book_set = serializers.SlugRelatedField(many=True,read_only=True,slug_field='title')


    class Meta:
        model = Publish
        fields = '__all__'

返回关联字段slug_field='title’的值
在这里插入图片描述

class BookModelSerializer(serializers.ModelSerializer):


    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):

    book_set = serializers.SlugRelatedField(many=True,queryset=Book.objects.all(),slug_field='title')


    class Meta:
        model = Publish
        fields = '__all__'

使用queryset方式
在这里插入图片描述

多对一关系中,在多的一方查一的一方的数据,需要在多的一方加字段,用多的一方里的外键字段

class BookModelSerializer(serializers.ModelSerializer):

    publish = serializers.SlugRelatedField(slug_field='name',queryset=Publish.objects.all())

    class Meta:
        model = Book
        fields = '__all__'


class PublishModelSerializer(serializers.ModelSerializer):


    class Meta:
        model = Publish
        fields = '__all__'

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【DRF】序列化器ModelSerializer的使用 的相关文章

  • App Engine 上的 Django 与 webapp2 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python,Google Places API - 给定一组纬度/经度查找附近的地点

    我有一个由商店 ID 及其纬度 经度组成的数据框 我想迭代该数据框 并使用 google api 为每个商店 ID 查找附近的关键地点 例如输入 Store ID LAT LON 1 1 222 2 222 2 2 334 4 555 3
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • 使用 scikit 时 scipy.sparse 矩阵的缩放问题

    在使用 scikit learn 解决机器学习问题时 我需要在使用 SVM 进行训练之前对 scipy sparse 矩阵进行缩放 但在文档 http scikit learn org stable modules preprocessin
  • 会话数据库表清理

    该表是否需要清除或者由 Django 自动处理 Django 不提供自动清除功能 然而 有一个方便的命令可以帮助您手动完成此操作 Django 文档 清除会话存储 https docs djangoproject com en dev to
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • 了解 Python 2.7 中的缩进错误

    在编写 python 代码时 我往往会遇到很多缩进错误 有时 当我删除并重写该行时 错误就会消失 有人可以为菜鸟提供 python 中 IndentationErrors 的高级解释吗 以下是我在玩 CheckIO 时收到的最近 inden
  • pandas groupby 操作缺少数据

    在 pandas 数据框中 我有一列如下所示 0 M 1 E 2 L 3 M 1 4 M 2 5 M 3 6 E 1 7 E 2 8 E 3 9 E 4 10 L 1 11 L 2 12 M 1 a 13 M 1 b 14 M 1 c 15
  • Snakemake:将多个输入用于具有多个子组的一个输出的规则

    我有一个工作管道 用于下载 比对和对公共测序数据执行变体调用 问题是它目前只能在每个样本的基础上工作 i e作为每个单独测序实验的样本 如果我想对一组实验 例如样本的生物和 或技术复制 执行变体调用 则它不起作用 我试图解决它 但我无法让它
  • Python:导入模块一次然后与多个文件共享

    我有如下文件 file1 py file2 py file3 py 假设这三个都使用 lib7 py lib8 py lib9 py 目前 这三个文件中的每一个都有以下行 import lib7 import lib8 import lib
  • 如何从邻接表高效创建稀疏邻接矩阵?

    我正在与last fm http labrosa ee columbia edu millionsong lastfm数据集来自百万歌曲数据集 http labrosa ee columbia edu millionsong 数据以一组 j
  • 如何将 URL 添加到 Telegram Bot 的 InlineKeyboardButton

    我想制作一个按钮 可以从 Telegram 聊天中在浏览器中打开 URL 外部超链接 目前 我只开发了可点击的操作按钮 update message reply text Subscribe to us on Facebook and Te
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何在引发异常时将变量传递给异常并在异常时检索它?

    现在我只有一个空白的异常类 我想知道如何在引发变量时给它一个变量 然后在 try except 中处理它时检索该变量 class ExampleException Exception pass 为其构造函数提供一个参数 将其存储为属性 然后
  • py2exe ImportError:没有名为 的模块

    我已经实现了一个名为 myUtils 的包 它由文件夹 myUtils 文件 组成 init py 和许多名称为 myUtils 的 py 文件 该包包含在 myOtherProject py 中 当我从 Eclipse 运行它们时可以找到
  • ProcessPoolExecutor 传递多个参数

    ESPN播放器免费 class ESPNPlayerFree def init self player id match id match id team 团队名单1 277906 cA2i150s81HI3qbq1fzi za1Oq5CG
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan
  • 想要定制django Rest框架Browsable API页面

    问题 我想自定义 django Rest Framework Browsable API 页面 使其具有与我的 Web 应用程序的其余部分相同的外观和感觉 安装的软件 Python 3 6 Django 1 10 6 Django 休息框架

随机推荐

  • swagger3的配置和使用(一)

    目录 Swagger3简介 Swagger的组成 Swagger的Springboot配置 maven添加依赖 创建swagger的配置类 访问路径 application yml环境配置 API分组 Swagger常用注解 注解说明 用于
  • URLSearchParams快速解析URL查询参数

    浏览器 Window 内置的 URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串 再也不用 字符串分割的方式去解析 url query 参数了 一 URLSearchParams 构造函数 URLSearc
  • 百度APP视频播放中的解码优化

    背景 在全民视频的时代 百度APP中视频播放是十分重要的业务 随着 5G 的到来 视频播放已经不满足以前的标清 高清 超清乃至于 4K 已经是旧时王谢堂前燕飞入寻常百姓家 越来越清晰的视频源 越来越复杂的视频编码 对 APP 的视频解码能力
  • Android设备接入阿里云IoT物联网平台——设备接入类

    1 准备工作 1 1 注册阿里云账号 使用个人淘宝账号或手机号 开通阿里云账号 并通过 实名认证 可以用支付宝认证 1 2 免费开通IoT物联网套件 产品官网 https www aliyun com product iot 1 3 软件环
  • 微信小程序发布迭代版本后如何提示用户强制更新新版本

    在点击小程序发布的时候选择 升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal
  • esp32 CMT130-V1.0 PS 240*240屏幕显示一张图片的实验

    1 使用ImageConverter565软件 将图片转为120 120大小 保存为后缀名为 c的文件 保存 2 具体pic c代码如下 3 改为如下格式的文件pic h 复制到路径 Arduino hardware espressif e
  • python 结合 Flask 的html页面嵌入for 语句

    近期有个项目 使用python和Flask框架 渲染页面后 需要使用循环显示不定长的数据 由于Flask是基于python的web框架 因此可以在html页面中直接使用 嵌套python语法 官方示例如下 https dormousehol
  • linux rpm包的编译

    有些软件包的特性是编译者选定的 如果编译未选定此特性 将无法使用 rpm包的版本落后于源码包 因此需要定制安装 也就是手动编译安装 编译需要编译环境 编译的过程如下 1 下载源码 2 执行 tar xf 3 cd到源码文件夹内 config
  • 按键状态机(实现单击,长按,双击)的模块分享

    目录 一 相关说明 二 分析 三 模块代码 三 代码讲解 四 作者的话 一 相关说明 1 需要的资源 一个定时器 一个按键 2 相关设置 利用定时器计时中断 10ms进行一次按键扫描 3 使用说明 定时器中断的优先级要设置高一点 相关的宏定
  • Matplotlib控制线条的颜色与风格

    通常对图形的第一次调整是调整它线条的颜色与风格 plt plot 函数可以通过相应的参数设置颜色与风格 要修改颜色 就可以使用 color 参数 它支持各种颜色值的字符串 颜色的不同表示方法如下所示 plt plot x np sin x
  • 面试第一关:自我介绍【含自我介绍模板】

    芝士AI吃鱼 了解更多的面试 AI知识经验 自我介绍是每一个面试必不可少的环节 也是求职应聘必须克服的一关 通过自我介绍 吸引面试官的注意力 自我介绍是你与面试官建立联系的第一步 也是面试的一个重要环节 通过一个清晰 有条理的自我介绍 你可
  • 最详细查看apk签名信息

    首先你需要java环境 或者你安装了Android Studio 随便用手机下载一个apk 这里我用的是QQ的apk 然后将这个apk发送到电脑上 接下来将这个 apk后缀名改为 zip 如下图所示 然后就是超简单的解压缩 然后你可以看到下
  • 什么是数据安全性?

    数据安全性是指在数字信息的整个生命周期中保护数字信息不受未经授权的访问 损坏或盗窃 这个概念涵盖了信息安全的各个方面 从硬件和存储设备的物理安全到管理和访问控制 以及软件应用程序的逻辑安全 数据安全涉及部署工具和技术 以增强组织对其关键数据
  • rust react tauri app 现有前端项目打包(windows)

    现有前端项目打包 环境配置 nodejs及相应包管理器 npm或yarn rust 开发环境 WebView2 安装 下载地址https developer microsoft com en us microsoft edge webvie
  • 导入exel后端校验完直接返回结果excel流前端自动下载

    var formData new FormData layero find form 0 var xhr new XMLHttpRequest xhr responseType blob xhr onload function e if t
  • mysql 5.7 主从配置优化_mysql-5.7的主从配置

    mysql的主从配置 下载最新mysql 的yum源 1 wget https dev mysql com get mysql57 community release el6 11 noarch rpm 安装最新mysql rpm ivh
  • mysql binlog 日志详解

    一 binlog概述 binlog是Mysql sever层维护的一种二进制日志 与innodb引擎中的redo undolog是完全不同的日志 其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句 并以 事务 的形式保存在磁盘中
  • SpringBoot对数据进行持久化

    SpringBoot关闭服务后 对数据进行持久化操作 文章目录 SpringBoot关闭服务后 对数据进行持久化操作 1 放入需要持久化的数据 2 调用自定义的销毁方法 3 关闭程序可见控制台输入需要持久化的数据 提示 以下是本篇文章正文内
  • textarea高度随内容自动改变

    需求 textarea默认的高度不是对着内容变化 而是随着内容增多 出现了滚动条 目前的需求是实现一个能够输入的textarea 并且高度跟着内容变化 发现了一个比较好用的插件flexText 但是这个基于jquery写的 目前的技术栈是r
  • 【DRF】序列化器ModelSerializer的使用

    不使用序列化器的过程 1 把前端发送请求过来的json字符串 通过json loads转换成字典 字典转换为Python对象 存在数据库 2 返回给前端数据 是把对象查询出来 转换成字典 再通过JsonResponse转换为json字符串