rest_framework_django学习笔记一(序列化器)

rest_framework_django学习笔记一(序列化器)

一、引入Django Rest Framework

1、安装

pip install djangorestframework

2、引入

INSTALLED_APPS = [
	...
    'rest_framework',
]

3、原始RESTful接口写法

models.py

from django.db import models

''' 测试数据 仅供参考
INSERT INTO `demo_app_author` VALUES (1, '令狐冲', 25, 1);
INSERT INTO `demo_app_author` VALUES (2, '任我行', 58, 2);
INSERT INTO `demo_app_author` VALUES (3, '任盈盈', 23, 3);
INSERT INTO `demo_app_author` VALUES (4, '扫地僧', 99, 4);
INSERT INTO `demo_app_author` VALUES (5, '乔峰', 99, 5);
INSERT INTO `demo_app_authordetail` VALUES (1, 1, '13432335433', '华山', '1994-05-23');
INSERT INTO `demo_app_authordetail` VALUES (2, 1, '13943454554', '黑木崖', '1961-08-13');
INSERT INTO `demo_app_authordetail` VALUES (3, 0, '13878934322', '黑木崖', '1996-05-20');
INSERT INTO `demo_app_authordetail` VALUES (4, 0, '13878938322', '少林', '1996-05-20');
INSERT INTO `demo_app_authordetail` VALUES (5, 0, '13878939322', '大宋', '1996-05-20');
INSERT INTO `demo_app_book` VALUES (1, '笑傲江湖', 33.30, '2023-11-11', 1);
INSERT INTO `demo_app_book` VALUES (2, '天龙八部', 33.30, '2023-11-11', 1);
INSERT INTO `demo_app_book_authors` VALUES (1, 1, 1);
INSERT INTO `demo_app_book_authors` VALUES (2, 1, 2);
INSERT INTO `demo_app_book_authors` VALUES (3, 2, 1);
INSERT INTO `demo_app_book_authors` VALUES (4, 2, 2);
INSERT INTO `demo_app_publish` VALUES (1, '华山出版社', '华山', 'ceshi1@qq.com');
INSERT INTO `demo_app_publish` VALUES (2, '明教出版社', '黑木崖', 'ceshi2@qq.com');
INSERT INTO `demo_app_publish` VALUES (2, '萧峰版社', '大宋', 'ceshi3@qq.com');
'''

class Book(models.Model):
	title = models.CharField(max_length=32)
	price = models.DecimalField(max_digits=5, decimal_places=2)
	pub_date = models.DateField()
	publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
	authors = models.ManyToManyField("Author")
	class Meta:
		verbose_name = '书籍表'

class Publish(models.Model):
	name = models.CharField(max_length=32)
	city = models.CharField(max_length=64)
	email = models.EmailField()
	class Meta:
		verbose_name = '出版社表'

class Author(models.Model):
	name = models.CharField(max_length=32)
	age = models.SmallIntegerField()
	au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE)
	class Meta:
		verbose_name = '作者表'


class AuthorDetail(models.Model):
	gender_choices = (
	(0, "女"),
	(1, "男"),
	(2, "保密"),
	)
	gender = models.SmallIntegerField(choices=gender_choices)
	tel = models.CharField(max_length=32)
	addr = models.CharField(max_length=64)
	birthday = models.DateField()
	class Meta:
		verbose_name = '作者详情表'

urls.py

urlpatterns = [
	path('books/',BookListView.as_view()),# 列表视图
	path('books/<int:id>/',BookDataView.as_view()),# 详情视图
]

vuew.py

from django.http import JsonResponse, HttpResponse
from django.shortcuts import render
from django.utils.html import escape
# Create your views here.
'''
GET  /books/         提供所有数据
POST /books/         增加一条数据
GET  /books/<pk>/    提供指定id的记录
PUT  /books/<pk>/    修改指定ID的记录
DELETE /books/<pk>/  删除指定id的记录  
'''
from django.views import View
from .models import *
class BookListView(View):
	'''
	列表视图
	'''
	def get(self,request):
		'''查询所有数据'''
		# 1、查询出所有图书模型
		book_list = Book.objects.filter().order_by('id')
		# 2、遍历出里面的每个数据模型对象,把模型对象转换成json对象
		data_list = []
		for book in book_list:
			book_dict = {
				'id':book.id,
				'title':book.title,
				'price':book.price,
				'pub_date':book.pub_date,
				'publish':{
					'id':book.publish.id,
					'name':book.publish.name,
					'city':book.publish.city,
					'email':book.publish.email,
				},
			}
			# 多堆对多
			authors_list = book.authors.filter()
			authors_data_list = []
			for authors in authors_list:
				authors_dict = {
						'id': authors.id,
						'name': authors.name,
						'age': authors.age,
						'gender': authors.au_detail.gender,
						'tel': authors.au_detail.tel,
						'addr': authors.au_detail.addr,
				}
				authors_data_list.append(authors_dict)

			book_dict['authors'] = authors_data_list
			data_list.append(book_dict)
		# 3、响应
		return JsonResponse(data_list,safe=False)
	def post(self,request):
		title = escape(request.POST.get('title',''))
		price = escape(request.POST.get('price',''))
		pub_date = escape(request.POST.get('pub_date',''))
		publish_id = escape(request.POST.get('publish_id',''))
		publish = Publish.objects.filter(pk=int(publish_id)).first()

		book = Book(
			title = title,
			price = price,
			pub_date = pub_date,
			publish = publish
		)
		book.save()
		# 新增关联
		authors = Author.objects.filter(pk__in=[1, 2])
		book.authors.add(*authors)
		book_dict = {
			'id': book.id,
			'title': book.title,
			'price': book.price,
			'pub_date': book.pub_date,
			'publish': {
				'id': book.publish.id,
				'name': book.publish.name,
				'city': book.publish.city,
				'email': book.publish.email,
			},
		}
		authors_list = book.authors.filter()
		authors_data_list = []
		for authors in authors_list:
			authors_dict = {
				'id': authors.id,
				'name': authors.name,
				'age': authors.age,
				'gender': authors.au_detail.gender,
				'tel': authors.au_detail.tel,
				'addr': authors.au_detail.addr,
			}
			authors_data_list.append(authors_dict)

		book_dict['authors'] = authors_data_list
		return JsonResponse(book_dict)


class BookDataView(View):
	''' 详情视图 '''
	def get(self,request,id):
		''' 指定某个 图书接口'''
		# 1、获取出指定id的那个模型对象
		book = Book.objects.filter(pk=id).first()
		# 2、模型对象字典
		if not book:
			return JsonResponse({'msg':"未查询到数据"})
		book_dict = {
			'id': book.id,
			'title': book.title,
			'price': book.price,
			'pub_date': book.pub_date,
			'publish': {
				'id': book.publish.id,
				'name': book.publish.name,
				'city': book.publish.city,
				'email': book.publish.email,
			},
		}
		authors_list = book.authors.filter()
		authors_data_list = []
		for authors in authors_list:
			authors_dict = {
				'id': authors.id,
				'name': authors.name,
				'age': authors.age,
				'gender': authors.au_detail.gender,
				'tel': authors.au_detail.tel,
				'addr': authors.au_detail.addr,
			}
			authors_data_list.append(authors_dict)

		book_dict['authors'] = authors_data_list
		# 3、响应
		return  JsonResponse(book_dict)
	def put(self,request,id):
		''' 修改 '''
		# 1、先获取前端传入的新数据
		# 2、将后端传入的数据就行赋值
		book_obj = Book.objects.filter(pk=id).first()
		if not book_obj:
			return JsonResponse({'msg':"未查询到信息"})
		title = escape(request.POST.get('title', ''))
		price = escape(request.POST.get('price', ''))
		pub_date = escape(request.POST.get('pub_date', ''))
		publish_id = escape(request.POST.get('publish_id', ''))

		if title:
			book_obj.title = title
		if price:
			book_obj.price = price
		if pub_date:
			book_obj.pub_date = pub_date
		if publish_id:
			publish = Publish.objects.filter(pk=int(publish_id)).first()
			book_obj.publish = publish
		book_obj.save()
		# 3、返回
		book_dict = {
			'id': book_obj.id,
			'title': book_obj.title,
			'price': book_obj.price,
			'pub_date': book_obj.pub_date,
			'publish': {
				'id': book_obj.publish.id,
				'name': book_obj.publish.name,
				'city': book_obj.publish.city,
				'email': book_obj.publish.email,
			},
		}
		authors_list = book_obj.authors.filter()
		authors_data_list = []
		for authors in authors_list:
			authors_dict = {
				'id': authors.id,
				'name': authors.name,
				'age': authors.age,
				'gender': authors.au_detail.gender,
				'tel': authors.au_detail.tel,
				'addr': authors.au_detail.addr,
			}
			authors_data_list.append(authors_dict)

		book_dict['authors'] = authors_data_list
		return JsonResponse(book_dict)


	def delete(self,request,id):
		''' 删除 '''
		delete = Book.objects.filter(pk=id).delete()
		return JsonResponse({'msg':"删除成功"})

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

4、快速上手

urls.py

from rest_framework.routers import DefaultRouter
from django.urls import path
from .views import *
import rest_fromwork_views

urlpatterns = []

router = DefaultRouter()# 创建路由器
router.register(r'book',rest_fromwork_views.BookView)# 注册路由
urlpatterns += router.urls# 把生成好的路由拼接到urlpatterns中去

views.py

'''
GET  /book/         提供所有数据
POST /book/         增加一条数据
GET  /book/<pk>/    提供指定id的记录
PUT  /book/<pk>/    修改指定ID的记录
DELETE /book/<pk>/  删除指定id的记录  
'''
from rest_framework.viewsets import ModelViewSet
from .models import *
from .serializers import *

class BookViews(ModelViewSet):
	''' 定义类视图 '''
	# 1、指定查询集  queryset 
	queryset = Book.objects.filter()
	# 2、指定序列化器  serializer_class
	serializer_class = BookSerializer

serializers.py

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

class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'

class BookSerializer(serializers.ModelSerializer):
    publish = PublishSerializer()
    authors = AuthorSerializer(many=True)
    class Meta:
        model = Book
        fields = '__all__'

在这里插入图片描述

浏览器发起请求
在这里插入图片描述

二、序列化器

1、序列化器的作用

1.1 对数据进行转换

序列化(输出、read_only)和反序列化(输入、write_only)

1.2进行数据的校验

判断用户发送的数据是否合法(is_valid(raise_exception=True))

2、序列化器

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

class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class BookSerializer(serializers.ModelSerializer):
    publish = PublishSerializer()
    authors = AuthorSerializer(many=True)
    class Meta:
        model = Book
        fields = '__all__'
class NewBookSerializer(serializers.Serializer):
        id = serializers.IntegerField(label="ID",read_only=True)# read_only=True只能做输出不能做输入;write_only=True:输入
        title = serializers.CharField(label="标题",max_length=32,required=True)# required=True 必传,不写默认 True;只有当模型中 有默认值和允许为空才可以为 False
        price = serializers.DecimalField(label="价格",max_digits=5,decimal_places=2)
        pub_date = serializers.DateField()
        publish = PublishSerializer()
        authors = AuthorSerializer(many=True)

3、字段与选项

选项参数

参数名称作用
max_length最大长度
min_length最小长度
allow_blank是否允许为空
trim_whitespace是否截断空白字符
max_value最小值
min_value最大值

通用类型

参数名称说明
read_only表明该字段仅用于序列化输出,默认False
write_only表明该字段仅用于反序列化输入,默认False
default反序列化时使用的默认值
allow_null表明该字段是否允许传入None,默认False
validators该字段使用的验证器
error_messages包含错误编号与错误的信息的字典
label用于HTML展示API页面时,显示的字段名称
help_text用于HTML展示API页面时,显示的字段帮助提示信息
required表明该字段的反序列化时必须虚入,默认值为True

4、Serializer

在这里插入图片描述

反序列化内容 中没有具体的 保存和修改方法,需要自己重写保存和修改方法。

from rest_framework import serializers
class NewPublishSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    name = serializers.CharField(label="出版社名称",max_length=32,required=True)
    city = serializers.CharField(label="城市",max_length=64,required=True)
    email = serializers.EmailField(label="邮箱",required=True)
    def create(self, validated_data):
        '''
        使用方法
        NewPublishSerializer(data=data)
        当调用序列化器的 save() 方法时,如果当初创建序列化器对象是没有 instance 传参数
        :param validated_data: 得到的是 反序列化后的字段数据
        :return:
        '''
        # 创建内容
        publish = Publish.objects.create(**validated_data)
        return publish

    def update(self, instance, validated_data):
        '''
        使用方法:
         NewPublishSerializer(instance=publish,data=data)
        重写 update 方法  NewPublishSerializer(instance=publish,data=data)
        如果创建序列化器时给 instance 传了参数,在调用序列化器的 save() 方法时实现时机会调用当前的 update
        :param instance: 要修改的模型对象
        :param validated_data:得到的是 反序列化后的字段数据
        :return: 返回修改后的模型对象
        '''
        instance.name = validated_data.get('name')
        instance.city = validated_data.get('city')
        instance.email = validated_data.get('email')
        instance.save()
        return instance

新增

from django.test import TestCase
from demo_app.serializers import *
data = {
	'name':'武当山出版社',
	'city':'武当山',
	'email':'1235698@qq.com',
}
serializer = NewPublishSerializer(data=data)
is_valid = serializer.is_valid()# 调用序列化的校验方法  True 或 False
print('校验是否通过is_valid:',is_valid)
errors = serializer.errors # 获取校验的错误信息
print('校验不通过内容原因errors:',errors)
#serializer.validated_data # 获取反序列化校验后的数据还是字段
print(serializer.validated_data)
publish = serializer.save()

在这里插入图片描述

修改方法

from demo_app.serializers import *
data = {
	'name':'武当山出版社',
	'city':'武当山1111',
	'email':'1235698@qq.com',
}
publish_obj = Publish.objects.get(id=3)
# 调用
serializer = NewPublishSerializer(instance=publish_obj,data=data)
is_valid = serializer.is_valid(raise_exception=True)
publish = serializer.save()

在这里插入图片描述

说明

调用序列化器的 .save() 方法,调用save 时会判断当初始创建序列化器时是否传入 instance ,如果传了 instance 也传了data 那么调用 save 实际调用序列化器中的 update() 方法反之就是调用序列化器中的 create 方法。

5、ModelSerializer

如果我们想要使用序列化器对应的是django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。

ModelSerilizer与常规的Serializer 相同,但提供了:

  • ModelSerializer可以工具模型自动生成序列化器中的字段
  • ModelSerializer它里面已经帮我们实现了create和update方法

1、定义

创建BookSerializer

from rest_framework import serializers
from .models import Book, Publish, Author,AuthorDetail
class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class BookSerializer(serializers.ModelSerializer):
    publish = PublishSerializer()# 外键
    authors = AuthorSerializer(many=True)# 多对多
    class Meta:
        model = Book
        fields = '__all__'
  • model 指明参照那个模型类
  • fields 指明为模型类的哪些字段生成

通过 ModelSerializer 实现字段自动生成

在这里插入图片描述

1.1 fields

只要一部分字段实现方法1 fields

from rest_framework import serializers
from .models import Book, Publish, Author,AuthorDetail
class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class AuthorDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthorDetail
        fields = '__all__'
class BookSerializer(serializers.ModelSerializer):
    publish = PublishSerializer()
    authors = AuthorSerializer(many=True)
    class Meta:
        model = Book
        # fields = '__all__' # 全部字段
        fields = ['id','title','publish','authors']# 只要list中的字段

在这里插入图片描述

1.2 exclude

只要一部分字段实现方法2 exclude

from rest_framework import serializers
from .models import Book, Publish, Author,AuthorDetail
class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class AuthorDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthorDetail
        fields = '__all__'
class BookSerializer(serializers.ModelSerializer):
    publish = PublishSerializer()
    authors = AuthorSerializer(many=True)
    class Meta:
        model = Book
        # fields = '__all__' # 全部字段
        # fields = ['id','title','publish','authors']# 只要list中的字段
        exclude = ['pub_date'] #除了 pub_date 字段不映射 其他字段都要

在这里插入图片描述

1.3 extra_kwargs

其中自动生成的 字段中有些默认值会出现 问题例如 authors 中的 age字段 最小值是 -32768 在实际中最小值不可能小于0因此可以通过 extra_kwargs 来进行自定义限制

from rest_framework import serializers
from .models import Book, Publish, Author,AuthorDetail
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
        # 对 额外的字段进行修改
        extra_kwargs = {
            'age':{'min_value':0}# age 是对应字段名,min_value 对应的校验属性,都是以字典的形式
        }

在这里插入图片描述

1.4 read_only_fields

只对某些字段进行序列化

from rest_framework import serializers
from .models import Book, Publish, Author,AuthorDetail
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
        # 对 额外的字段进行修改
        # extra_kwargs = {
        #     'age':{'min_value':0}
        # }
        read_only_fields = ['age'] # 只对某些字段进行序列化

在这里插入图片描述

我们可以在python manage.py shell 中查看自动生成的 BookSerializer 的具体实现

我们可以在python manage.py shell 中查看自动生成的 BookSerializer 的具体实现

三、序列化

提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其他库自动和反序列化;

提供了丰富的类视图、Mixin扩展类,简化视图的编写;

丰富的定制层级:函数视图、类视图、视图集合到自动生成API,满足各种需求;

多种身份认证和权限认证的支持;

内置限流系统;

只管的API web界面;

扩展性,插件丰富;

序列化器的作用:

1、进行数据的校验。
2、对数据对象进行转换。

1、提示

在开发REST API 接口时,视图中的主要有三件事:

  1. 将 请求的数据(如JSON格式)转换为模型类对象(反序列化)
  2. 操作数据库
  3. 将模型类对象转换为响应的数据(如JSON格式)(序列化)

2、序列化(Serializer)

2.1 概念

将程序中的一个数据结构类型转换为其他格式(字典、JSON、XML等)

2.2 序列化行为

for book in book_list:
    book_dict = {
        'id':book.id,
        'title':book.title,
        'price':book.price,
        'pub_date':book.pub_date,
        'publish':{
            'id':book.publish.id,
            'name':book.publish.name,
            'city':book.publish.city,
            'email':book.publish.email,
        },
    }
    # 多对多
    authors_list = book.authors.filter()
    authors_data_list = []
    for authors in authors_list:
        authors_dict = {
            'id': authors.id,
            'name': authors.name,
            'age': authors.age,
            'gender': authors.au_detail.gender,
            'tel': authors.au_detail.tel,
            'addr': authors.au_detail.addr,
        }
        authors_data_list.append(authors_dict)

book_dict['authors'] = authors_data_list
data_list.append(book_dict)
# 3、响应
return JsonResponse(data_list,safe=False)

2.3序列化时机

当前端需给前端响应模型数据时,需要将模型数据序列化成前端需要的格式。

2.4 使用方式

在序列化器中有两个属性 instancedata

instance参数: 模型、查询集、字典

#如果只给  instance 形参传递参数表示做序列化
serializer = BookSerializer(instance=book)
serializer.data # 就可以获取序列化后的数据

测试一

tests.py

from django.test import TestCase
# Create your tests here.
from demo_app.serializers import *
from demo_app.models import *
datas = Book.objects.filter()
print("查询出的数据内容有多少条:",datas.count())
serializer = NewBookSerializer(instance=datas,many=True)# many=True:表示有多条数据,当只有一条数据的时候就不用many=False;默认many=False
print(serializer.data)
# 执行上述代码使用
'''
python manage.py test
'''

在这里插入图片描述

测试二

在序列化器中多增加一列

'''serializers.py'''
from rest_framework import serializers
class NewBookSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="id",read_only=True)
    title = serializers.CharField(label="标题",max_length=32)
    price = serializers.DecimalField(label="价格",max_digits=5,decimal_places=2)
    pub_date = serializers.DateField()
    publish = PublishSerializer()
    authors = AuthorSerializer(many=True)
    helle = serializers.CharField()# 多余字段
'''tests.py'''
from django.test import TestCase
# Create your tests here.
from demo_app.serializers import *
from demo_app.models import *
data = Book.objects.get(id=1)
data.helle = "测试多增加字段内容"
# print("查询出的数据内容有多少条:",data.count())
serializer = NewBookSerializer(instance=data)# many=True:表示有多条数据,当只有一条数据的时候就不用many
print(serializer.data)
'''
python manage.py test
'''

在这里插入图片描述

2.5 外键序列化器

2.5.1 PrimaryKeyRelatedField(正向)

主要字段 serializers.PrimaryKeyRelatedField

class NewBookSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="id",read_only=True)
    title = serializers.CharField(label="标题",max_length=32)
    price = serializers.DecimalField(label="价格",max_digits=5,decimal_places=2)
    pub_date = serializers.DateField()
    # read_only = True :只做序列化
    # queryset=Publish.objects.all() 当输入查询时不是Publish这里面的数据就会 报错
    # PrimaryKeyRelatedField 外键关联
    publish = serializers.PrimaryKeyRelatedField(label="出版社",read_only=True,queryset=Publish.objects.all())
from demo_app.serializers import *
from demo_app.models import *
data = Book.objects.get(id=1)
data.helle = "测试多增加字段内容"
# print("查询出的数据内容有多少条:",data.count())
serializer = NewBookSerializer(instance=data)# many=True:表示有多条数据,当只有一条数据的时候就不用many
print(serializer.data)

在这里插入图片描述

**注意:**默认是将 关联的id查询出来。

2.5.2 StringRelatedField(正向)
class NewBookSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="id",read_only=True)
    title = serializers.CharField(label="标题",max_length=32)
    price = serializers.DecimalField(label="价格",max_digits=5,decimal_places=2)
    pub_date = serializers.DateField()
    # read_only = True :只做序列化
    # queryset=Publish.objects.all() 当输入查询时不是Publish这里面的数据就会 报错
    # PrimaryKeyRelatedField 外键关联
    publish = serializers.StringRelatedField(label="出版社",read_only=True)
    # publish = PublishSerializer()
    # authors = AuthorSerializer(many=True)
    # helle = serializers.CharField()# 多余字段
from django.test import TestCase
# Create your tests here.
from demo_app.serializers import *
from demo_app.models import *
data = Book.objects.get(id=1)
data.helle = "测试多增加字段内容"
# print("查询出的数据内容有多少条:",data.count())
serializer = NewBookSerializer(instance=data)# many=True:表示有多条数据,当只有一条数据的时候就不用many
print(serializer.data)

在这里插入图片描述

**注意:**返回值是 对象 obje (*) 的字符串

2.5.3 外键序列化器(正向)

将关联模型对象的序列化器中所有字段序列化出来

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

class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'
class NewBookSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="id",read_only=True)
    title = serializers.CharField(label="标题",max_length=32)
    price = serializers.DecimalField(label="价格",max_digits=5,decimal_places=2)
    pub_date = serializers.DateField()
    # read_only = True :只做序列化
    # queryset=Publish.objects.all() 当输入查询时不是Publish这里面的数据就会 报错
    # PrimaryKeyRelatedField 外键关联
    # publish = serializers.StringRelatedField(label="出版社",read_only=True)
    publish = PublishSerializer()
    # authors = AuthorSerializer(many=True)
    # helle = serializers.CharField()# 多余字段

在这里插入图片描述

2.5.4 外键反向序列化

出版社反向获取 书籍;

# coding=utf-8
'''
@date:2023/11/15 11:48
@mail:xiaochun235@qq.com
@Content: 序列化器
'''
from rest_framework import serializers
from .models import Book, Publish, Author

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class NewBookSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="id",read_only=True)
    title = serializers.CharField(label="标题",max_length=32)
    price = serializers.DecimalField(label="价格",max_digits=5,decimal_places=2)
    pub_date = serializers.DateField()
    # publish = PublishSerializer()
    # authors = AuthorSerializer(many=True)
    # helle = serializers.CharField()# 多余字段

class NewPublishSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    name = serializers.CharField(label="出版社名称",max_length=32,required=True)
    city = serializers.CharField(label="城市",max_length=64,required=True)
    email = serializers.EmailField(label="邮箱",required=True)
    book_set = NewBookSerializer(many=True)  # 注意

from django.test import TestCase
# Create your tests here.
from demo_app.serializers import *
from demo_app.models import *
data = Publish.objects.get(id=1)
data.helle = "测试多增加字段内容"
# print("查询出的数据内容有多少条:",data.count())
serializer = NewPublishSerializer(instance=data)# many=True:表示有多条数据,当只有一条数据的时候就不用many
print(serializer.data)

在这里插入图片描述

**注意:**使用 modesel名小写 + _set

2.6 多对多序列化

2.6.1 使用对应的序列化器(正向)
# coding=utf-8
'''
@date:2023/11/15 11:48
@mail:xiaochun235@qq.com
@Content: 序列化
'''
from rest_framework import serializers
from .models import Book, Publish, Author
class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
class NewBookSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="id",read_only=True)
    title = serializers.CharField(label="标题",max_length=32)
    price = serializers.DecimalField(label="价格",max_digits=5,decimal_places=2)
    pub_date = serializers.DateField()
    publish = PublishSerializer()
    authors = AuthorSerializer(many=True)# 注意多对多 时 many=True
    # helle = serializers.CharField()# 多余字段
from django.test import TestCase
# Create your tests here.
from demo_app.serializers import *
from demo_app.models import *
data = Book.objects.get(id=1)
data.helle = "测试多增加字段内容"
# print("查询出的数据内容有多少条:",data.count())
serializer = NewBookSerializer(instance=data)# many=True:表示有多条数据,当只有一条数据的时候就不用many
print(serializer.data)

在这里插入图片描述

2.6.2 多对多 (反向)
# coding=utf-8
'''
@date:2023/11/15 11:48
@mail:xiaochun235@qq.com
@Content: 序列化器
'''
from rest_framework import serializers
from .models import Book, Publish, Author,AuthorDetail

class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publish
        fields = '__all__'

class AuthorDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthorDetail
        fields = '__all__'

class NewBookSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="id",read_only=True)
    title = serializers.CharField(label="标题",max_length=32)
    price = serializers.DecimalField(label="价格",max_digits=5,decimal_places=2)
    pub_date = serializers.DateField()
    # publish = PublishSerializer()
    # authors = AuthorSerializer(many=True)
    # helle = serializers.CharField()# 多余字段

class NewAuthSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="id", read_only=True)
    name = serializers.CharField(label="姓名",max_length=32)
    age = serializers.CharField(label="年龄",max_length=32)
    au_detail = AuthorDetailSerializer()
    book_set = NewBookSerializer(many=True)
from django.test import TestCase
# Create your tests here.
from demo_app.serializers import *
from demo_app.models import *
data = Author.objects.get(id=1)
data.helle = "测试多增加字段内容"
# print("查询出的数据内容有多少条:",data.count())
serializer = NewAuthSerializer(instance=data)# many=True:表示有多条数据,当只有一条数据的时候就不用many
print(serializer.data)

在这里插入图片描述

注意: 反向序列化使用 模型名+_set 即可

总结

  1. 注意 many 的使用,many默认为 False;当需要序列化多个是记得 Many=True;
  2. 注意需求,序列化的反向正向;
  3. 将模型转换为JSON数据步骤:
    1. 定义序列化器类(模型名 / 类视图名+Serializer) 继承 Sarializer;
    2. 定义序列化器中的字段参照模型(序列化器中的字段可以比模型多或少 如果表示是模型中的字段在序列化器中这个字段名应该和模型中字段名一致)
  4. 如果在多里面关联序列化一(外键)如果在一里面关联序列化多(多的一方模型小写_set)
  5. 如果在一的一方关联序列化多时,需要指定关联字段many=True
  6. 将要序列化模型或查询集 传给序列化器类的 instance 参数 如果传的是查询集 多指定 many=True
  7. 获取序列化后的数据 序列化器对象 .data 属性

3、反序列化(Serializer)

拿到前端传入的数据 —》 序列化器的data --》 调用序列化器的 .is_valid() 方法进行校验 —》 调用序列化器的 .save() 方法。

3.1 概念

将其他格式(字典、JSON、XML等)转换为程序中的数据,例如JSON字符串转换为django中的模型类对象。

3.2反序列化行为

title = escape(request.POST.get('title',''))
price = escape(request.POST.get('price',''))
pub_date = escape(request.POST.get('pub_date',''))
publish_id = escape(request.POST.get('publish_id',''))
publish = Publish.objects.filter(pk=int(publish_id)).first()
book = Book(
    title = title,
    price = price,
    pub_date = pub_date,
    publish = publish
)

3.3 反序列化时机

当需要将用户发送的数据存储到数据库之前,需要使用反序列化。

3.4 使用方式

在序列化器中有两个属性 instancedata

#如果只给  instance 形参传递参数表示做序列化
serializer = BookSerializer(data=jsondata)
serializer.data # 就可以获取反序列化数据

反序列化 = 前端发送的数据 —》 经过验证 --》python字典 —》 save --》 模型对象

**案例使用 Serializer **

反序列化内容 中没有具体的 保存和修改方法,需要自己重写保存和修改方法。

from rest_framework import serializers
class NewPublishSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    name = serializers.CharField(label="出版社名称",max_length=32,required=True)
    city = serializers.CharField(label="城市",max_length=64,required=True)
    email = serializers.EmailField(label="邮箱",required=True)
    def create(self, validated_data):
        '''
        使用方法
        NewPublishSerializer(data=data)
        当调用序列化器的 save() 方法时,如果当初创建序列化器对象是没有 instance 传参数
        :param validated_data: 得到的是 反序列化后的字段数据
        :return:
        '''
        # 创建内容
        publish = Publish.objects.create(**validated_data)
        return publish

    def update(self, instance, validated_data):
        '''
        使用方法:
         NewPublishSerializer(instance=publish,data=data)
        重写 update 方法  NewPublishSerializer(instance=publish,data=data)
        如果创建序列化器时给 instance 传了参数,在调用序列化器的 save() 方法时实现时机会调用当前的 update
        :param instance: 要修改的模型对象
        :param validated_data:得到的是 反序列化后的字段数据
        :return: 返回修改后的模型对象
        '''
        instance.name = validated_data.get('name')
        instance.city = validated_data.get('city')
        instance.email = validated_data.get('email')
        instance.save()
        return instance

新增

from django.test import TestCase
from demo_app.serializers import *
data = {
	'name':'武当山出版社',
	'city':'武当山',
	'email':'1235698@qq.com',
}
serializer = NewPublishSerializer(data=data)
is_valid = serializer.is_valid()# 调用序列化的校验方法  True 或 False
print('校验是否通过is_valid:',is_valid)
errors = serializer.errors # 获取校验的错误信息
print('校验不通过内容原因errors:',errors)
#serializer.validated_data # 获取反序列化校验后的数据还是字段
print(serializer.validated_data)
publish = serializer.save()

在这里插入图片描述

修改方法

from demo_app.serializers import *
data = {
	'name':'武当山出版社',
	'city':'武当山1111',
	'email':'1235698@qq.com',
}
publish_obj = Publish.objects.get(id=3)
# 调用
serializer = NewPublishSerializer(instance=publish_obj,data=data)
is_valid = serializer.is_valid(raise_exception=True)
publish = serializer.save()

在这里插入图片描述

调用序列化器的 .save() 方法,调用save 时会判断当初始创建序列化器时是否传入 instance ,如果传了 instance 也传了data 那么调用 save 实际调用序列化器中的 update() 方法反之就是调用序列化器中的 create 方法。

3.4、要属性和方法

1 is_valid()

在获取反序列化的数据前,必须调用 is_valid() 方法进行验证,验证成功返回True,否则返回False

2error 属性

验证失败,可以通过序列化器对象的error属性获取错误学习,返回字典,包含了字段和字 段的错误。

3validated_data属性

验证成功,可以通过序列化器对象的 validated_data 属性获取数据。

4context 参数是额外的添加数据
# 可以通过序列化器 进行context 进行传输数据
publish = NewPublishSerializer(instance=None,data=data,context={'request':request})

# 获取context 中的数据
class NewPublishSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    name = serializers.CharField(label="出版社名称",max_length=32,
                                 required=True,validators=[custom_fun1,custom_fun2]
                                 )
    city = serializers.CharField(label="城市",max_length=64,required=True)
    email = serializers.EmailField(label="邮箱",required=True)
    def create(self, validated_data):
        '''
        当调用序列化器的 save() 方法时,如果当初创建序列化器对象是没有 instance 传参数
        :param validated_data: 得到的是 反序列化后的字段数据
        :return:
        '''
        # 创建内容
        publish = Publish.objects.create(**validated_data)
        return publish

    def update(self, instance, validated_data):
        '''
        重写 update 方法
        如果创建序列化器时给 instance 传了参数,在调用序列化器的 save() 方法时实现时机会调用当前的 update
        :param instance: 要修改的模型对象
        :param validated_data:得到的是 反序列化后的字段数据
        :return: 返回修改后的模型对象
        '''
        request = self.context['request']
        instance.name = validated_data.get('name')
        instance.city = validated_data.get('city')
        instance.email = validated_data.get('email')
        instance.save()
        return instance

3.5、反序列化自定义校验字段

1 单个字段校验(validate_+字段名称)
class NewPublishSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    name = serializers.CharField(label="出版社名称",max_length=32,required=True)
    city = serializers.CharField(label="城市",max_length=64,required=True)
    email = serializers.EmailField(label="邮箱",required=True)

    # 序列化器中单独增加校验逻辑
    def validate_name(self,value):
        '''
        复杂校验内容数据   validate_+字段名称
        :param value:  当前字段值
        :return: 返回value
        '''
        if '出版社' not in value:
            # 只要在序列化器中  抛出的异常都叫做  ValidationError 异常
            raise serializers.ValidationError('名称中不包含 出版社等字')
        return value # 将校验内容返回回去

测试代码

from demo_app.serializers import *
data = {
	'name':'武当',
	# 'city':'武当山',
	'email':'1235698@qq.com',
}
serializer = NewPublishSerializer(data=data)
is_valid = serializer.is_valid()# 调用序列化的校验方法  True 或 False
print('校验是否通过is_valid:',is_valid)
#is_valid2 = serializer.is_valid(raise_exception=True)# raise_exception=True 如果有异常会自动输出异常# 就不用在.error 获取异常
#print('校验是否通过is_valid2:',is_valid2)
errors = serializer.errors # 获取校验的错误信息
print('校验不通过内容原因errors:',errors)
serializer.validated_data # 获取反序列化校验后的数据还是字段

在这里插入图片描述

2多个字段联合校验( validate)
class NewPublishSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    name = serializers.CharField(label="出版社名称",max_length=32,required=True)
    city = serializers.CharField(label="城市",max_length=64,required=True)
    email = serializers.EmailField(label="邮箱",required=True)
    def validate(self,attrs):
        '''
        同时校验多个字段  联合校验
        :param attrs: 里面是前端 传入过来的所有数据
        :return: 返回数据
        # 在联合校验中,可以对单个字段进行校验也可以对多个字段进行校验
        # 也可以对在传入的字段中增加 一个属性
        '''
        name = attrs['name']
        print(attrs)
        if '出版社' not in name:
            # 只要在序列化器中  抛出的异常都叫做  ValidationError 异常
            raise serializers.ValidationError('名称中不包含 出版社等字')
        return attrs
from demo_app.serializers import *
data = {
	'name':'武当',
	'city':'武当山',
	'email':'1235698@qq.com',
}
serializer = NewPublishSerializer(data=data)
is_valid = serializer.is_valid()# 调用序列化的校验方法  True 或 False
print('校验是否通过is_valid:',is_valid)
errors = serializer.errors # 获取校验的错误信息
print('校验不通过内容原因errors:',errors)
# serializer.validated_data # 获取反序列化校验后的数据还是字段

在这里插入图片描述

注意:

  • 校验字段 统一写法为 validate_+字段名称;
  • 校验不通过统一抛出异常:serializers.ValidationError();
  • 校验顺序:序列化器中定义的校验先开始,才走 单个字段校验,最后才是联合校验;
3 自定义方法校验(validators参数)

在字段中添加 validators 选项参数,可以补充验证行为;

**使用:**当多个字段存在相同的校验就可以使用自定义的方法校验。

def custom_fun1(value):
    if '出版社' not in value:
        # 只要在序列化器中  抛出的异常都叫做  ValidationError 异常
        raise serializers.ValidationError('名称中不包含 出版社等字')
    return value
def custom_fun2(value):
    if 'python' in value:
        # 只要在序列化器中  抛出的异常都叫做  ValidationError 异常
        raise serializers.ValidationError('名称中不能包含 python')
    return value

class NewPublishSerializer(serializers.Serializer):
    id = serializers.IntegerField(label="ID",read_only=True)
    name = serializers.CharField(label="出版社名称",max_length=32,
                                 required=True,validators=[custom_fun1,custom_fun2]
                                 )
    city = serializers.CharField(label="城市",max_length=64,required=True)
    email = serializers.EmailField(label="邮箱",required=True)
from django.test import TestCase
from demo_app.serializers import *
data = {
	'name':'武当python',
	'city':'武当山',
	'email':'1235698@qq.com',
}
serializer = NewPublishSerializer(data=data)
is_valid = serializer.is_valid()# 调用序列化的校验方法  True 或 False
print('校验是否通过is_valid:',is_valid)
errors = serializer.errors # 获取校验的错误信息
print('校验不通过内容原因errors:',errors)
# serializer.validated_data # 获取反序列化校验后的数据还是字段

在这里插入图片描述

4、总结

在开发REST API接口时,我们在视图中需要做的最核心的事是:

  • 将数据库数据序列化为前端所需要的格式并返回;
  • 将前端发送的数据反序列化为模型类对象,并保存到数据库中;
  • 反序列化步骤:
    • 获取前端楚然的缴纳字典数据;
    • 创建序列化器给序列化器的 data参数传参(要以关键字方式传递);
    • 调用序列化器的 .is_valid(raise_excption=True)进行校验,如果校验出错会自动抛出错误信息;
    • 如果校验成功,就调用save() 方法。(当调用序列化器的save方法时,会执行序列化器中的 create方法或update方法。如果要使用update方法那么就需要将 BookSerializer(instance=book,data=data),只有传了模型此时修改,否则就是新增。)查看序列化器的;
  • 使用Serializer构造序列化器时,调用序列化器的 .save() 方法,调用save 时会判断当初始创建序列化器时是否传入 instance ,如果传了 instance 也传了data 那么调用 save 实际调用序列化器中的 update() 方法反之就是调用序列化器中的 create 方法。(代码实现:四 --》 4 Serializer);
  • 反序列化会自动完成序列化;
  • 序列化就是将模型转为字典;

其他笔记

序列化器

视图路由

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/206694.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go学习之json和单元测试知识

文章目录 一、json以及序列化1.概述2.json应用场景图3.json数据格式说明4.json的序列化1&#xff09;介绍2&#xff09;应用案例 5.json的反序列化1&#xff09;介绍2&#xff09;应用案例 二、单元测试1.引子2.单元测试-基本介绍3.代码实现4.单元测试的细节说明5.单元测试的综…

JAVA全栈开发 day15_集合(Set接口、增强For循环、Map体系)

一、增加for遍历集合 语法&#xff1a; for(数据类型 变量名: 数组名或集合){​ }//集合遍历 &#xff0c;推荐使用增加for 1.静态导入 注意事项&#xff1a; 方法必须是静态注意不要和本类的方法同名&#xff0c;如果同名&#xff0c;记得加前缀&#xff0c;由此可…

R语言30分钟入门

1. 环境&安装 R是支持win、linux合macos的 完整参考&#xff1a;https://zhuanlan.zhihu.com/p/596324321?utm_id0 主要是安装&#xff1a;1、R环境&#xff1b;2、rstudio开发环境&#xff08;后面主要是用rstudio&#xff0c;也可以用vscode&#xff09; 1.1. rstud…

进程间的信号

1. 进程信号 1.1 进程信号的概念 信号是一个软件中断&#xff0c;通知进程某个事件发生了异步事件&#xff0c;打断进程当前的操作&#xff0c;去处理这个事件&#xff0c;信号是多种多样的&#xff0c;并且一个信号对应一个事件&#xff0c;这样才能做到进程收到一个信号后&…

微服务--08--Seata XA模式 AT模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式事务Seata 1.XA模式1.1.两阶段提交1.2.Seata的XA模型1.3.优缺点 AT模式2.1.Seata的AT模型2.2.流程梳理2.3.AT与XA的区别 分布式事务 > 事务–01—CAP理论…

web:ics-05(本地文件包含漏洞、preg_replace函数/e漏洞、php伪协议读取文件)

题目 打开页面显示如下 只有这个页面能打开 显示如下 用dirsearch扫一下 查看了一下&#xff0c;发现没什么用 查看页面源代码 返回了&#xff0c;写入的参数&#xff0c;猜测可能有文件包含漏洞 用php伪协议读取文件 构造payload ?pagephp://filter/readconvert.base64-en…

计算机网络:应用层(上篇)

文章目录 前言一、应用层协议原理1.网络应用的体系结构2.进程通信 二、Web与HTTP1.HTTP概况2.HTTP连接3.HTTP请求报文4.用户-服务器状态&#xff1a;cookies5.Web缓存&#xff08;代理服务器&#xff09; 三、FTP&#xff1a;文件传输协议1.FTP&#xff1a;控制连接与数据连接分…

excel 计算断面水质等级

在工作中遇到根据水质监测结果要判断断面等级。写了下面的公式&#xff1a; 因子标准值 limits {COD: [15,15, 20, 15,20],氨氮: [0.15, 0.5, 1, 1.5, 2.0],总磷: [0.02, 0.1, 0.2, 0.3, 0.4] } excel公式&#xff1a; IFS(MAX(IF(M2>20,1,0), IF(N2>2,1,0), IF(O2&g…

专业级音频处理 Logic Pro X 中文 for Mac

Logic Pro X是一款专业音频制作和音乐创作软件。它是Mac电脑上最受欢迎和广泛使用的音频工作站&#xff08;DAW&#xff09;。Logic Pro X提供了丰富的功能和工具&#xff0c;适用于音乐制作、录音、编辑、混音和音频处理等方面。以下是Logic Pro X软件的一些主要特点和功能&am…

C++11.30

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 代码&#xff1a; #include <iostream>using …

web前端开发简介及门槛、学习路线

1. 什么是web&#xff1f; Web是 world wide web,万维网,广域网,互联网 Web可以理解是网站 2. 什么网站和网页&#xff1f; 网站是由多个网页和其他文件组成的 3. 什么是web的前端和后端&#xff1f; 4.网页的组成&#xff1a; html: 在网页中真实存在的,例如: 文本,输入…

2023年亚太杯数学建模C题新能源汽车(思路模型代码)

一、翻译 新能源汽车是指采用先进的技术原理、新技术和新结构&#xff0c;以非常规车用燃料&#xff08;非常规车用燃料是指汽油和柴油以外的燃料(非常规车用燃料是指汽油和柴油以外的燃料&#xff09;&#xff0c;并集成了汽车动力控制和驱动等先进技术的汽车。新能源汽车包括…

四 STM32F4 实现外部中断以及串口打印

参考文章&#xff1a; 中断-NVIC 以及EXTI外设详解 这里使用STM32F411U6 微控制器 &#xff0c; 这里使用PC15产生脉冲信号&#xff0c; 并利用PA1 引脚输入信息来触发外部中断 . 1. 初始化外部中断 EXIT_init() 对用到的外设进行时钟使能配置引脚PC15 为输出 &#xff0c; …

IDEA2023找不到 Allow parallel run

我的idea版本&#xff1a;2023.1.4 第一步&#xff1a;点击Edit Configrations 第二步&#xff1a;点击Modify options 第三步&#xff1a;勾选Allow multiple instances 最后点击Apply应用一下 ok,问题解决&#xff01;

生成对抗网络(GAN)手写数字生成

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09; 二、什么是生成对抗网络1. 简单介绍2. 应用领域 三、网络结构四、构建生成器五、构建鉴别器六、训练模型1. 保存样例图片2. 训练模型 七、生成动图 一、前言 我的环境&#xff1…

《合成孔径雷达成像算法与实现》_使用CS算法对RADARSAT-1数据进行成像

CSA 简介&#xff1a;Chirp Scaling 算法 (简称 CS 算法&#xff0c;即 CSA) 避免了 RCMC 中的插值操作。该算法基于 Scaling 原理&#xff0c;通过对 chirp 信号进行频率调制&#xff0c;实现了对信号的尺度变换或平移。基于这种原理&#xff0c;可以通过相位相乘代替时域插值…

Tomcat安装及配置教程

Tomcat安装及配置教程 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量…

Spring Security 的使用

一、简介 1.1、Spring Security 相关概念 1.过滤器链&#xff08;Filter Chain&#xff09; 基于Servlet过滤器&#xff08;Filter&#xff09;处理和拦截请求&#xff0c;进行身份验证、授权等安全操作。过滤器链按顺序执行&#xff0c;每个过滤器负责一个具体的安全功能。 …

什么是网络可视化?网络可视化工具有用吗

网络可视化定义是自我描述的&#xff0c;因为它在单个屏幕上重新创建网络布局&#xff0c;以图形和图表的形式显示有关网络设备、网络指标和数据流的信息&#xff0c;为 IT 运营团队提供一目了然的理解和决策。 网络是复杂的实体&#xff0c;倾向于持续进化&#xff0c;随着业…

利用MCMC 获得泊松分布

写出概率流方程如下 if state 0: if np.random.random() < min([Lambda/2, 1]):state 1else:passelif state 1:if choose_prob_state[i] < 0.5:#选择 1 -> 0&#xff0c;此时的接受概率为min[2/Lambda, 1]if np.random.random() < min([2/Lambda, 1]…