APIView+Serializers的使用

1.APIview使用

https://www.cnblogs.com/xiaonq/p/10124104.html

  • ModelVIewSet是对APIView封装
  • ModelSerializer是对Serializers

1.1在user/urls.py

urlpatterns = [
path(‘apiview/’,views.UserInfroViewSet.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=True :该字段是必须的,不能为空
    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)

class UserInfoSerializer(serializers.Serializer):
	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) 
	xxx = serializers.SerializerMethodField(read_only=True) 自定义显示(显示多对 多) 

	class Meta: 
		model = User 	
	# 自定义显示 多对多 字段
	def get_xxx(self,row): 
	'''row: 传过来的正是 User表的对象''' 
	users = row.username # 获取用户名 
	return users
	# 定义创建语法: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_name(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.测试接口

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
在这里插入图片描述

2.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',
	 },
 }
Django REST framework (DRF) 是一个用于构建 Web API 的强大框架,它基于 Django 平台,提供了许多用于构建 RESTful API 的功能。 下面是使用 DRF 的一些步骤: 1. 安装 DRF 使用 pip 命令安装 DRF: ``` pip install djangorestframework ``` 2. 在 settings.py 中添加 DRF 在你的 Django 项目的 settings.py 文件中,添加以下内容: ```python INSTALLED_APPS = ( ... 'rest_framework', ... ) REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), } ``` 这将启用 DRF 并配置默认的身份验证和权限。 3. 创建序列化器 序列化器用于将数据模型转换为 JSON 或其他格式的数据。可以通过继承 DRF 的 Serializer 类来创建自定义序列化器。 例如,以下代码创建了一个名为 BookSerializer 的序列化器: ```python from rest_framework import serializers from myapp.models import Book class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = '__all__' ``` 4. 创建视图 视图定义了 API 中的端点和响应。可以通过继承 DRF 的 APIView 类来创建自定义视图。 例如,以下代码创建了一个名为 BookList 的视图,用于获取所有书籍: ```python from rest_framework.views import APIView from rest_framework.response import Response from myapp.models import Book from myapp.serializers import BookSerializer class BookList(APIView): def get(self, request): books = Book.objects.all() serializer = BookSerializer(books, many=True) return Response(serializer.data) ``` 5. 创建 URL 在 Django 项目的 urls.py 文件中,创建 URL 映射以将视图与端点关联起来。 例如,以下代码将 URL /books 映射到 BookList 视图: ```python from django.urls import path from myapp.views import BookList urlpatterns = [ path('books/', BookList.as_view(), name='book-list'), ] ``` 6. 运行应用程序 运行 Django 应用程序并在浏览器中访问 http://localhost:8000/books/,就可以看到所有书籍的 JSON 数据了。 这只是 DRF 的基础知识。要深入了解 DRF,请查看官方文档:https://www.django-rest-framework.org/ 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值