序列化
1.APIview使⽤用
https://www.cnblogs.com/xiaonq/p/10124104.html https://www.cnblogs.com/xiaonq/p/10987889.html
ModelViewSet 是对APIView 封装ModelSerializer 是对Serializer
1.1在user/urls.py 中添加路路由
urlpatterns = [
path('apiview/', views.UserInfoViewSet.as_view()),
]
1.2创建user/serializers.py写序列列化器器
serializers.ModelSerializer 和serializers.Serializer field参数说明
''' field参数 ''' # 1.read_only
read_only=True 表示不不允许⽤用户⾃自⼰己上传,只能⽤用于api的输出,序列列化的时候也不不⽤用对这个数据进⾏行行
验证,序列列化返回是有改字段
# 2.write_only
write_only=True 表示在更更新或创建实例例时可以使⽤用该字段,但在序列列化返回时不不包括该字段。
# 3.required:该字段是必需的,不不能为空
required=True 反序列列化(前端返回数据必须包含此字段)的时候必须提供这个字段 设置False 可以不不提供
# 4.allow_null/allow_blank:该字段允许为null/空allow_null=True 可以为null 设置False则不不能为null # 5.label:标签,⽤用于对字段显示设置
# 6.help_text:对字段进⾏行行解释的⼀一段⽂文本,⽤用于提示# 7.style:说明字段的类型
# 8.error_messages:字段出错时,信息提示
创建user/serializers.py写序列列化器器
# class User(AbstractUser):
phone = models.CharField('⼿手机号',max_length=20)
img = models.ImageField(upload_to='user',null=True) nick_name = models.CharField('昵称',max_length=20) address = models.CharField('地址',max_length=255)
id = serializers.CharField(read_only=True) # 普通字段,设置id为只读字段,不不能修
改
username =
serializers.CharField(min_length=3,max_length=20,error_messages={'required': '该字段必填'}) # 显示普通字段
img = serializers.ImageField(required=False) nick_name = serializers.CharField(max_length=20) address = serializers.CharField(max_length=255)
class Meta:
model = User
定义创建语法:ser.save()执⾏行行,就会⽴立刻调⽤用create⽅方法⽤用来创建数据
def create(self, validated_data): '''validated_data: 表单或者vue请求携带的json:
{"username":"zhangsan","password":"123456"}'''
# https://www.cnblogs.com/xiaonq/p/7978409.html return User.objects.create(**validated_data)
定义更更新⽅方法
def update(self, instance, validated_data): '''
instance : 查询的对象
validated_data : postman提交的json数据
{"username":"zhangsan","password":"123456"} '''
if validated_data.get('username'): instance.username = validated_data['username']
instance.save() return instance
定义单⼀一字段验证的⽅方法
def validate_username(self, value): if value == 'root':
raise serializers.ValidationError('不不能创建root管理理员账号')
return value
定义多字段验证⽅方法
def validate(self, attrs): print(attrs)
if attrs.get("username") == 'admin':
raise serializers.ValidationError('不不能创建admin⽤用户') return attrs
1.3在user/views.py 中添加视图函数
from user.serializers import UserInfoSerializer class UserInfoViewSet(APIView):
# 查询⽤用户信息
def get(self, request, *args, **kwargs): # ⼀一对多、多对多查询都是⼀一样的语法
obj = User.objects.all()
ser = UserInfoSerializer(instance=obj,many=True) # 关联数据多个# ser = UserInfoSerializer(instance=obj[0]) # 关联数据⼀一个return Response(ser.data, status=200)
# 创建⽤用户
'''创建⽤用户'''
def post(self,request):
ser = UserInfoSerializer(data=request.data) # 判断提交数据是否合法
if ser.is_valid(): ser.save()
return Response(data=ser.data, status=201) return Response(data=ser.errors,status=400)
# 更更新⽤用户信息
def put(self, request):
pk = request.query_params.get('pk') try:
userinfo = User.objects.get(id = pk) except Exception as e:
return Response(data='⽤用户不不存在', status=201)
# 创建序列列化对象,并将要反序列列化的数据传递给data构造参数,进⽽而进⾏行行验证
ser = UserInfoSerializer(userinfo,data=request.data) if ser.is_valid():
ser.save()
return Response(data=ser.data, status=201) return Response(data=ser.errors,status=400)
2.序列列化正想反相查询
https://www.cnblogs.com/xiaonq/p/10987889.html#i3
3.测试接⼝口
3.1查询所有⽤用户
http://192.168.56.100:8888/user/apiview/
3.2创建⽤用户
http://192.168.56.100:8888/user/apiview/
3.3更更新⽤用户信息
http://192.168.56.100:8888/user/apiview/?pk=7
3.4限流功能测试
http://192.168.56.100:8888/user/apiview/ '''修改syl/settings.py配置限速设置''' REST_FRAMEWORK = {
#3.1 限流策略略
'DEFAULT_THROTTLE_RATES': {
'user': '3/hour', # 认证⽤用户每⼩小时10次
'anon': '3/day',
},
}
2.序列化ModelSelializer,最常用也最简单
from rest_framework import serializers
from .models import *
class ModelNameSerializer(serializers.ModelSerializer):
class Meta:
model = modelname #指定要序列化的名
fields = '__all__' #指定要序列化的字段名,也可单或多个字段,all代表全部
depth = 1 #指定关联的表的深度