API:权限,认证,限流,序列化,过滤,排序,版本,分页
目录
1、APIview的使用
ModelViewSet
是对APIview
封装ModelSerializer
是对Serializer
封装
1.1、在user/urls.py中添加路由
urlpatterns=[
path('apiview/',views.UserInfoViewSet.as_view()),
]
1.2、创建user/serializer.py写序列化器
serizlizers.ModelSerializer
和serializer.Serializer
field参数说明
'''field参数'''
1. real_only
# real_only = True 表示不允许用户自己上传,只能用于api的输出,序列化的时候也不用对这个数据进行验证,系列化返回是有该字段
2. wirte_only
# write_only = True 表示在更新或创新创建实例时可以使用该字段,但在序列化返回是不包括该字段。
3. required:该字段是必须的,不能为空
# required = True 反序列化(前端返回数据必须包含此字段)的时候必须提供这个字段 设置False可以不提供
4.allow_null/all_blank: 该字段允许为null/空
# allow_null = True 可以为null,设置False则不能为null
5. label:标签,用于对字段的显示设置
6. help_text: 对该字段进行解释的一段文本,用于提示
7. style:说明该字段的类型
8. error_messages: 该字段出错是,信息提示
- 创建user/serializers.py写序列化器
class UserInfoSerializer(serializer.Serializer):
id = serializer.CharField(read_only=True) # 普通字段,设置id为只读字段,不能修改
username = serializer.CharField(min_length=3,max_length=20,error_message={'required':'该字段必填'}) # 显示普通字段
img = serializer.ImageField(required=False)
nick_name = serializer.CharField(max_length=255)
xxx = serializers.SerializerMethodField(read_only=True) # 自定义显示(显示多对多)
class Meta:
model = User
# 自定义显示,多对多字段
def get_xxx(selef,row):
'''row:传过来的正是User表的对象'''
users = row.username # 获取用户名
return user
def create(self,validated_data):
'''validated_data:表单或vue请求携带的json:{"username":"zhangsan"password":"123456"}'''
return User.objects.create(**validated_data)
# 定义单一字段验证的方法:
def validate_name(self,value):
if value =='root':
raise serializers.ValidationError("不能创建管理员账号")
return value
# 定义多字段验证方法
def validate(self,attrs):
if attrs.get('username') == 'admin':
raise serializers.ValidationError('不能创建admin用户')
return attrs
1.3、在user/views.py
中添加视图函数
from user.serializers import UserInfoSeiralizer
class UserInfoViewSet(APIView):
def get(self,request,*args,**kwargs):
# 一对多、多对多查询都是一样的语法
obj = User.objects.all()
ser = UserInfoSerializer(instance=obj,many=True) # 关联数据多个
# ser = UserInfoSerlializer(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.error,status=400)
# 更新用户信息
def put(self,request):
pk = request.query_params.get('pk')
try:
userinfo = User.objects.get(id=pk)
excpet Excpetion as e:
return Response(data='用户不存在',satus=201)
if ser.is_valid():
ser.save()
return Response(data=ser.error,status=400)
2、测试接口
2.1、查询所有用户
http://192.168.56.100:8888/user/apiview/
2.2、创建用户
http://192.168.56.100:8888/user/apiview/
2.3、更新用户信息
http://192.168.56.100:8888/user/apiview/?pk=7