【三】DRF序列化进阶

序列化器的定义与使用

多表关联序列化

【1】准备工作

# settings.py
DATABASES = {'default': {# 数据库引擎选择使用MySQL'ENGINE': 'django.db.backends.mysql',# 指定数据库名字,需提前创建'NAME': 'books',# 指定数据库用户名'USER': 'root',# 指定数据库用户密码'PASSWORD': '123123',# 指定数据库连接IP'HOST': '127.0.0.1',# 指定数据库端口'PORT': 3306,# 指定数据库默认编码集(可选)'CHARSET': 'utf8mb4',}
}

【2】定制返回格式之source

# models.py
from django.db import modelsclass Book(models.Model):name = models.CharField(max_length=64)title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)publish_date = models.DateField()publish = models.ForeignKey(to='Publish', on_delete=models.SET_NULL, null=True)authors = models.ManyToManyField(to='Author')def __str__(self):return self.titleclass Publish(models.Model):name = models.CharField(max_length=32,)addr = models.CharField(max_length=64)# 该字段不是给models看的,而是给校验行组件使用的email = models.EmailField()def __str__(self):return self.nameclass Author(models.Model):name = models.CharField(max_length=32,null=True)age = models.IntegerField()def __str__(self):return self.name
  • 创建一个序列化serial.py文件
from rest_framework import serializers
from rest_framework.exceptions import ValidationErrordef data_name(name):if name.startswith('shi'):raise ValidationError('不能用shi开头')else:return nameclass TaskSerializer(serializers.Serializer):# required=False表明该字段在反序列化时必须输入,默认True# allow_null	表明该字段是否允许传入None,默认False# default	    反序列化时使用的默认值task_name = serializers.CharField(required=False,allow_null=True,default='默认字段',validators=[data_name])task_id = serializers.CharField(max_length=64,validators=[data_name])task_time = serializers.DateTimeField()class BookSerializer(serializers.Serializer):#  source 定制返回字段名,跟name必须对应book_name = serializers.CharField(source='name')# 显示出版社名字-->字符串类型--》CharField  可以跨表查询book_publish = serializers.CharField(source='publish.name')# 所有字段都可以被转成CharFieldpublish_id = serializers.IntegerField(source='publish.id')title = serializers.CharField()price = serializers.IntegerField()publish = serializers.CharField()
  • book_name: 这是书籍的名称字段,source='name' 表示它会从模型中的 name 字段获取数据。
  • book_publish: 这是书籍的出版社名称字段,source='publish.name' 表示它会从关联的出版社模型中的 name 字段获取数据。
  • publish_id: 这是书籍的出版社ID字段,source='publish.id' 表示它会从关联的出版社模型中的 id 字段获取数据。
  • title: 这是书籍的标题字段,直接从模型中的 title 字段获取数据。
  • price: 这是书籍的价格字段,直接从模型中的 price 字段获取数据。
  • publish: 这是书籍的出版社字段。然而,在代码中没有指定 source,这意味着它将尝试从模型中的 publish 字段获取数据。但是,publish 字段是一个 ForeignKey 字段,它应该是一个模型实例,而不是字符串,因此这里会出现问题。
# views.py
from rest_framework.views import APIView
from Api02.models import Book,Task2
from Api02.serial import BookSerializer
from rest_framework.response import Responseclass BookView(APIView):# 查询所有图书def get(self,request):print(request.data)# {'name': '去死', 'price': '222', 'publish': '人民日报'}res_list = Book.objects.all()print(res_list)# <QuerySet [<Book: 剑气长城>, <Book: 低头不见脚趾>, <Book: 恐怖如斯>, <Book: 大师>]>serializer = BookSerializer(instance=res_list,many=True)return Response(serializer.data)

image-20240413203820031

【3】定制返回字段模型类中书写方法

  • {name:书名,price:价格,publish:{name:出版社名,addr:地址},authors:[{},{}]}

返回详细信息

  • 先在models.py要实现表中添加
  • def publish_detail(self)这个函数跟我定义的serial.py中的字段要一致publish_detail
class Book(models.Model):name = models.CharField(max_length=64)title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)publish_date = models.DateField()publish = models.ForeignKey(to='Publish', on_delete=models.SET_NULL, null=True)authors = models.ManyToManyField(to='Author')def __str__(self):return self.name# 出版社对象@propertydef publish_detail(self):return {'name':self.publish.name,'addr':self.publish.addr}def authors_detail(self):list = []for author in self.authors.all():list.append({"name":author.name,'age':author.age})return list
# serial.py
class BookSerializer(serializers.Serializer):name = serializers.CharField()title = serializers.CharField()price = serializers.IntegerField()publish_date = serializers.DateField()# publish = serializers.CharField() # 如果这样写,会把publish对象,打印的样子返回给前端# def __str__(self):#     return self.name    你要在表中的publish写下这个# 出版社对象publish_detail = serializers.DictField()# 所有作者authors_detail = serializers.ListField()

image-20240413211150599

之前的更改名字也一样

就是serial.py里面的表的字段跟models.py文件中的函数一样就行def book_name(self):

class BookSerializer(serializers.Serializer):book_name = serializers.CharField()
class Book(models.Model):name = models.CharField(max_length=64)title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8, decimal_places=2)publish_date = models.DateField()publish = models.ForeignKey(to='Publish', on_delete=models.SET_NULL, null=True)authors = models.ManyToManyField(to='Author')def __str__(self):return self.name#   def book_name(self):#    return self.name + 'xxxxxxx'

image-20240413214310992

【4】通过SerializerMethodField定制字段

  • serial.py

from rest_framework import serializers
from rest_framework.exceptions import ValidationError
class BookSerializer(serializers.Serializer):name = serializers.CharField()title = serializers.SerializerMethodField()def get_title(self, res):return res.title + '云开月明!!'price = serializers.IntegerField()publish_date = serializers.DateField()# publish = serializers.CharField() # 如果这样写,会把publish对象,打印的样子返回给前端# def __str__(self):#     return self.name    你要在表中的publish写下这个# 出版社对象publish_detail = serializers.SerializerMethodField()def get_publish_detail(self, res):# res(任何obj、bai) 就是当前序列化到的book对象return {'name': res.publish.name, 'addr': res.publish.addr, 'id': res.pk}# 作者对象authors_detail = serializers.SerializerMethodField()def get_authors_detail(self, obj):data_list = []for i in obj.authors.all():data_list.append({'name': i.name, 'age': i.age, 'id': i.id})return data_list

image-20240413221140392

image-20240413220921587

Distributor经销商跟CarModel表车型是多对多关系
class DistributorSerializer(serializers.ModelSerializer):car_models = serializers.SlugRelatedField('''
many=True 表示这是一个多对多关系,即一个经销商可能销售多个车型。
read_only=True 表示该字段是只读的,不能用于创建或更新对象。
slug_field='name' 指定了作为标识的字段名,在这里是 CarModel 表中的 name 字段。这意味着在序列化时,将使用 CarModel 对象的 name 字段来表示关联的车型。'''many=True,read_only=True,slug_field='name')class Meta:model = Distributorfields = '__all__'

image-20240424095356579

# models.py
# 车厂
class CarFactory(models.Model):name = models.CharField(max_length=100)address = models.CharField(max_length=200)phone = models.CharField(max_length=20)def __str__(self):return self.name# 车型
class CarModel(models.Model):name = models.CharField(max_length=100)price = models.DecimalField(max_digits=10, decimal_places=2)# 一对多factory = models.ForeignKey(CarFactory, on_delete=models.CASCADE, related_name='models')def __str__(self):return self.name# serilaer.py    
# 一对多关系
class CarFactorySerializer(serializers.ModelSerializer):models = serializers.SerializerMethodField()def get_models(self, obj):# 获取与当前车厂相关联的所有车型models = obj.models.all()# 序列化车型数据serializer = CarModelSerializer(models, many=True)return serializer.dataclass Meta:model = CarFactoryfields = ('id', 'name', 'address', 'phone', 'models')
    def get_models(self, obj):# 获取与当前车厂相关联的所有车型car_models = obj.models.all()# 序列化车型数据serialized_models = []for car_model in car_models:serialized_model = {'name': car_model.name,'price': car_model.price,'id': car_model.pk,'factory': obj.pk  # 车厂的主键作为车型的工厂信息}serialized_models.append(serialized_model)return serialized_modelsclass Meta:model = CarFactoryfields = ('id', 'name', 'address', 'phone', 'models')

image-20240424100439927

image-20240424101250833

多表关联反序列化

【5】定制返回之子序列化

​ 这个的重点就是要定义一个字序列化的类PublishSerializer里面的字段名是要表中的有的字段名(列名)

当使用子序列化器时,有几个要注意的重点:

  1. 字段名和源字段的匹配: 确保在子序列化器中使用的 source 参数与模型中的字段名匹配。这样才能正确地将父对象的属性传递给子序列化器进行序列化。
  2. 多对多关系处理: 如果处理的是多对多关系,确保在子序列化器中设置 many=True 参数,以表示这是一个多个对象的集合。
  3. 数据验证: 子序列化器也可以执行数据验证。确保在子序列化器中定义了适当的验证规则,以确保父对象和子对象的数据都被正确验证。
# 子序列化class PublishSerializer(serializers.Serializer):id = serializers.IntegerField()name = serializers.CharField()addr = serializers.CharField()email = serializers.EmailField()class AuthorSerializer(serializers.Serializer):id = serializers.IntegerField()name = serializers.CharField()age = serializers.IntegerField()class BookSerializer(serializers.Serializer):name = serializers.CharField()title = serializers.CharField()price = serializers.IntegerField()publish_date = serializers.DateField()# 如果这样写,会把publish对象,打印的样子返回给前端# publish = PublishSerializer()# 修改字段的名字"publish_res"# 一对多关系publish_res = PublishSerializer(source='publish')# # 修改字段的名字"authors_list"# 多对多关系authors_list = AuthorSerializer(source='authors',many=True)

image-20240413223603552

【6】反序化的保存

【1】删除

  • views.py

class BookDetailView(APIView):def delete(self, request, pk):instance = Book.objects.filter(pk=pk).first()if not instance:return Response({'code': 404, 'msg': 'Book not found'}, status=status.HTTP_404_NOT_FOUND)instance.delete()return Response({'code': 200, 'msg': 'Book deleted successfully'}, status=status.HTTP_200_OK)
  • urls.py

​ 在路由配置中,path('books/<int:pk>/', BookDetailView.as_view()) 表示处理单个书籍的操作,包括查找、更改和删除。而 path('books/', BookView.as_view()) 则表示处理多个书籍的操作,包括查找全部和添加。

from django.urls import path
# BookView、BookDetailView 这个就是我在views.py 定义的类
from Api02.views import BookView,BookDetailView  #urlpatterns = [path('books/', BookView.as_view()),path('books/<int:pk>/', BookDetailView.as_view()),]
  • 序列化组

第一种方法

class PublishSerializer(serializers.ModelSerializer):# id = serializers.IntegerField()# name = serializers.CharField()# addr = serializers.CharField()# email = serializers.EmailField()class Meta:model = Publishfields = ['id', 'name', 'addr', 'email']class AuthorSerializer(serializers.ModelSerializer):# id = serializers.IntegerField()# name = serializers.CharField()# age = serializers.IntegerField()class Meta:model = Authorfields = ['id', 'name', 'age']class BookSerializer(serializers.ModelSerializer):# 如果这样写,会把publish对象,打印的样子返回给前端# publish = PublishSerializer()# 修改字段的名字"publish_res"publish_res = PublishSerializer(source='publish')authors_l = AuthorSerializer(source='authors', many=True)class Meta:model = Bookfields = ['id','name', 'title', 'price', 'publish_date', 'publish_res', 'authors_l', 'delete']

第二种方法

class PublishSerializer(serializers.ModelSerializer):id = serializers.IntegerField()name = serializers.CharField()addr = serializers.CharField()email = serializers.EmailField()# class Meta:#     model = Publish#     fields = ['id', 'name', 'addr', 'email']class AuthorSerializer(serializers.ModelSerializer):id = serializers.IntegerField()name = serializers.CharField()age = serializers.IntegerField()# class Meta:#     model = Author#     fields = ['id', 'name', 'age']class BookSerializer(serializers.ModelSerializer):id = serializers.IntegerField()name = serializers.CharField()title = serializers.CharField()price = serializers.IntegerField()publish_date = serializers.DateField()# 如果这样写,会把publish对象,打印的样子返回给前端# publish = PublishSerializer()# 修改字段的名字"publish_res"publish_res = PublishSerializer(source='publish')authors_l = AuthorSerializer(source='authors', many=True)class Meta:model = Bookfields = ['id','name', 'title', 'price', 'publish_date', 'publish_res', 'authors_l', 'delete']

image-20240414192226872

image-20240414192250051

【2】更新

  • views.py

class BookDetailView(APIView):def put(self, request, pk):# instance 就是序列化的  res_data就是反序列化的pk = Book.objects.filter(pk=pk).first()print(pk)res_data = BookSerializer(data=request.data, instance=pk)if res_data.is_valid():# 验证过后的数据print(res_data.validated_data)# 保存数据res_data.save()return Response({'code': 200, "msg": res_data.data})else:return Response({'code': 404, 'msg': res_data.errors})
  • urls.py

这个两个路由跟上述一样

from django.urls import path
# BookView、BookDetailView 这个就是我在views.py 定义的类
from Api02.views import BookView,BookDetailView  #urlpatterns = [path('books/', BookView.as_view()),path('books/<int:pk>/', BookDetailView.as_view()),]
  • 序列化组

ModelSerializer使用

​ ModelSerializer 是 Django REST Framework 提供的一个便捷的序列化器类,用于简化与数据库模型的交互。它可以自动根据模型字段生成对应的序列化字段,并提供默认的序列化和反序列化逻辑。

​ 在序列化组中,你可以使用 ModelSerializer 来快速地将数据库模型转换为 JSON 格式的数据,或者将 JSON 格式的数据反序列化为模型对象。

# ModelSerializer使用class PublishSerializer(serializers.ModelSerializer):class Meta:model = Publishfields = ['id', 'name', 'addr', 'email']class AuthorSerializer(serializers.ModelSerializer):class Meta:model = Authorfields = ['id', 'name', 'age']class BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = '__all__'# fields=['id','name','publish_detail','authors_list']extra_kwargs = {'name': {'max_length': 8},  # 限制name不能超过8'publish': {'write_only': True},'authors': {'write_only': True},}# 自己再重写的字段# 这个字段用来做序列化publish_detail = PublishSerializer(source='publish',read_only=True)# 这个字段用来做序列化authors_list = AuthorSerializer(source='authors', many=True,read_only=True)

这样要注意如果没有加上子序列化这种方法

class PublishSerializer(serializers.ModelSerializer):class Meta:model = Publishfields = ['id', 'name', 'addr', 'email']class AuthorSerializer(serializers.ModelSerializer):class Meta:model = Authorfields = ['id', 'name', 'age']# views.py就必须在加上 pk = Book.objects.filter(pk=pk).first()否则就会报错def put(self, request, pk):pk = Book.objects.filter(pk=pk).first()print(pk)res_data = BookSerializer(data=request.data, instance=pk)if res_data.is_valid():# 验证过后的数据print(res_data.validated_data)# 保存数据res_data.save()return Response({'code': 200, "msg": res_data.data})else:return Response({'code': 404, 'msg': res_data.errors})

第二种

这里要注意在输入的时候ID这个就是必填字段了

class BookSerializer(serializers.Serializer):id = serializers.IntegerField()name = serializers.CharField()title = serializers.CharField()price = serializers.IntegerField()publish_date = serializers.DateField()# 反序列化保持最要多表关联publish_save = serializers.IntegerField(source='publish',write_only=True)authors = serializers.ListField(write_only=True)# 更新def update(self, instance, validated_data):publish_id = validated_data.pop('publish')authors = validated_data.pop('authors')# 使用instance.pk获取主键值book_qs = Book.objects.filter(pk=instance.pk)# 使用update更新实例book_qs.update(**validated_data, publish_id=publish_id)# 获取更新后的实例instance = book_qs.first()

image-20240414194802347

image-20240414194850210

【3】添加

  • views.py

class BookView(APIView):def post(self, request):res_data = BookSerializer(data=request.data)print(res_data)if res_data.is_valid():# 验证过后的数据print(res_data.validated_data)# 保存数据res_data.save()return Response(res_data.data, status=status.HTTP_201_CREATED)else:return Response({'code': 404, 'msg': res_data.errors})
  • 序列化组

# 反序列化的保存
class BookSerializer(serializers.Serializer):name = serializers.CharField()title = serializers.CharField()price = serializers.IntegerField()publish_date = serializers.DateField()# 反序列化保持最要多表关联publish_save = serializers.IntegerField(source='publish',write_only=True)authors = serializers.ListField(write_only=True)
#
#     # 添加def create(self, validated_data):publish_id = validated_data.pop('publish')authors = validated_data.pop('authors')book = Book.objects.create(**validated_data, publish_id=publish_id)book.authors.add(*authors)return book

!在这里插入图片描述

image-20240414195306665

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式学习69-C++(Opencv)

知识零碎&#xff1a; QT的两种编译模式 1.debug 调试模式 …

时序图详解

1.这是iic总线在回应时候的时序图&#xff0c;data in代表eeprom收到数据&#xff0c;回stm32的ack&#xff0c;数据回应&#xff0c;data out代表stm32收到eeprom的消息&#xff0c;数据输出ack回应 2.交叉线 代表在这一次输出高电平&#xff0c;或者在这一次也可能输出低电…

【bash】笔记

在Shell脚本中&#xff0c;-e 是一个测试运算符&#xff0c;用于检查给定的文件或目录是否存在。 | 是通道符&#xff0c;会把前面的输出给后面作为输入。 sudo tee命令在这里用于同时更新文件和在终端显示输出&#xff08;尽管 > /dev/null 将标准输出重定向到黑洞&…

ai智能答题助手,这四款软件让知识触手可及!

在数字化时代&#xff0c;知识的获取变得前所未有的便捷。随着人工智能技术的不断发展&#xff0c;AI智能答题助手应运而生&#xff0c;成为了人们学习、工作和生活中的得力助手。今天&#xff0c;就为大家介绍四款备受欢迎的AI智能答题助手软件&#xff0c;让你感受知识的魅力…

俄罗斯国际消费类电子电器展ICEE:人潮如织,盛况空前

近日&#xff0c;备受全球瞩目的俄罗斯国际消费类电子电器展ICEE在莫斯科盛大落幕。本次展会为期四天&#xff0c;真的攒足了眼球&#xff0c;不仅俄罗斯这边的很多媒体和自媒体有报道&#xff0c;展会第一天&#xff0c;很多参展商通过短视频平台将展会的盛况传到了国内&#…

libcity/model/trajectory_loc_prediction/DeepMove.py

1 DeepMove 1.1 构造函数 1.2 初始化权重 1.3 forward 1.4 predict def predict(self, batch):score self.forward(batch)if self.evaluate_method sample:# build pos_neg_inedxpos_neg_index torch.cat((batch[target].unsqueeze(1), batch[neg_loc]), dim1)score tor…

在思科和华为上实现两个主机A,B A能ping通B,B不能ping通A

1.华为实验的topo如下 常规状态下任意两台主机都是可以ping通的 此时的需求是PC4能ping通PC2和PC3但是PC2和PC3不能ping通PC4 这里需要用到ACL策略 在接口上调用 验证&#xff1a; PC4能ping通PC2和PC3 PC2和PC3不能ping通PC4 2.思科类似 正常情况下是都能互相ping通 加上ac…

深入了解 NumPy:深度学习中的数学运算利器

文章目录 1. 导入NumPy2. 创建NumPy数组3. 数组的算术运算4. N维数组4.1 创建和操作多维数组4.2 高维数组 5. NumPy的广播功能5.1 基本广播示例5.2 更复杂的广播示例 6. 访问数组元素6.1 基于索引的访问6.2 遍历数组6.3 基于条件的访问6.4 高级索引6.5 性能考虑 在深度学习和数…

【idea-sprongboot项目】在linux服务器上纯远程开发方式

继上一篇博客【idea-sprongboot项目】SSH连接云服务器进行远程开发-CSDN博客 目录 五、远程开发方式 2&#xff09;纯远程开发方式 步骤 五、远程开发方式 2&#xff09;纯远程开发方式 实现原理&#xff0c; 步骤 &#xff08;1&#xff09;首先&#xff0c;关闭当前正在…

springMVC入门学习

目录 1、 什么是springmvc 2、springmvc工作流程 3、 springmvc快速入门&#xff08;XML版本&#xff09; 4、加载自定义目录下的springmvc.xml配置文件 5、 解析器InternalResourceViewResolver 6、 映射器BeanNameUrlHandlerMapping 7、 适配器SimpleControllerHandle…

el-select 点击按钮滚动到选择框顶部

主要代码是在visibleChange 在这个 popper 里面找到 .el-select-dropdown__list let popper ref.$refs.popper const ref this.$refs.select let dom popper.querySelector(.el-select-dropdown__list) setTimeout(() > { dom.scrollIntoView() }, 800) <templat…

CSF(Cloth Simulation Filter)点云地面点滤波

CSF[Cloth Simulation Filter]点云地面点滤波 0.引言1.布料模拟2.修改布料模拟3.布料滤波4.CSF总体过程 0.引言 code 基本原理&#xff1a;原始点云被倒置过来&#xff0c;然后⼀块布从上⽅掉落到倒置的表⾯。通过分析布的节点与相应的LIDAR点之间的相互作⽤&#xff0c;可以确…

【中级软件设计师】上午题15-计算机网络

上午题15-计算机网络 1 网络设备2 协议簇3 TCP和UDP4 SMTP和POP35 ARP和RARP6 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;7 URL8 浏览器9 IP地址和子网划分10 IPv611 Windows命令12 路由器 1 网络设备 物理层设备&#xff1a;中继器、集线器&#xff0…

Mysql基础(五)外键约束

一 外键 激励&#xff1a; 每天进步一点点即可 ① 思考 1、在MySQL中,我们知道主键 PRIMARY KEY的主要作用是唯一区分表中的各个行 [记录];思考&#xff1a;但是对于外键 foreign key比较陌生? 那么外键作用以及限制条件和目的呢? ② 外键的定义 1、外键是某个表 A中…

图像处理之SVD检测显示屏缺陷(C++)

图像处理之SVD检测显示屏缺陷&#xff08;C&#xff09; 文章目录 图像处理之SVD检测显示屏缺陷&#xff08;C&#xff09;前言一、SVD算法简介二、代码实现总结 前言 显示屏缺陷检测是机器视觉领域的一处较广泛的应用场景&#xff0c;显示屏主要有LCD和OLED&#xff0c;缺陷类…

基于java,SpringBoot和Vue的智慧校园在线考试留言讨论系统设计

摘要 基于Java, SpringBoot和Vue的智慧校园在线考试留言讨论系统是一个为现代教育需求定制的Web应用&#xff0c;它结合了最新的前后端技术来提供一个互动性强、用户友好的学习和交流平台。该系统旨在通过提供实时留言和讨论功能&#xff0c;增进学生间的互动以及师生之间的沟…

快来看 2024年ICLR杰出论文奖揭晓啦 值得关注

会议之眼 快讯 在人工智能的浪潮中&#xff0c;国际学习表征会议&#xff08;ICLR&#xff09;无疑是引领学术前沿的重要会议之一&#xff01;ICLR是深度学习领域的顶级会议之一&#xff0c;由深度学习领域的两位巨头Yoshua Bengio和Yann LeCun于2013年创办。 2024年5月6日&a…

NSSCTF中的web

目录 [第五空间 2021]WebFTP [LitCTF 2023]PHP是世界上最好的语言&#xff01;&#xff01; [SWPUCTF 2021 新生赛]PseudoProtocols [LitCTF 2023]导弹迷踪 [NISACTF 2022]easyssrf [第五空间 2021]WebFTP 1.进入页面&#xff0c;发现是登录页面&#xff0c;想到 弱口令&…

大模型微调之 在亚马逊AWS上实战LlaMA案例(六)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;六&#xff09; 通过 SageMaker Python SDK 进行微调Llama2 可以使用 SageMaker Python SDK 微调 Llama 2 模型。以下是在数据集上微调 Llama 2 7B 的示例代码&#xff1a; import os import boto3 from sagemaker.sessi…

28 JavaScript学习: 代码规范

代码规范通常包括以下几个方面: 变量和函数的命名规则空格&#xff0c;缩进&#xff0c;注释的使用规则。其他常用规范…… 变量名 在编写JavaScript代码时&#xff0c;遵守良好的变量命名规范是非常重要的&#xff0c;这可以增加代码的可读性和可维护性。以下是一些常见的…