APIView和serializers的使用
1.APIview使?
djangorestframework使用:http://www.rzrgm.cn/xiaonq/p/10124104.html
DjangoRestFramework使用:http://www.rzrgm.cn/xiaonq/p/10987889.html
- ModelViewSet 是對(duì) APIView 封裝
- ModelSerializer 是對(duì) Serializer
1.1 在user/urls.py中添加路由
urlpatterns = [
path('apiview/', views.UserInfoViewSet.as_view()),
]
1.2 創(chuàng)建user/serializers.py寫序列化器
- serializers.ModelSerializer 和 serializers.Serializer fifield參數(shù)說(shuō)明
''' field參數(shù) '''
# 1.read_only
read_only=True 表示不允許?戶??上傳,只能?于api的輸出,序列化的時(shí)候也不?對(duì)這個(gè)數(shù)據(jù)進(jìn)?驗(yàn)證,序列化返回是有改字段
# 2.write_only
write_only=True 表示在更新或創(chuàng)建實(shí)例時(shí)可以使?該字段,但在序列化返回時(shí)不包括該段。
# 3.required:該字段是必需的,不能為空
required=True 反序列化(前端返回?cái)?shù)據(jù)必須包含此字段)的時(shí)候必須提供這個(gè)字段 設(shè)置False 可以不提供
# 4.allow_null/allow_blank:該字段允許為null/空
allow_null=True 可以為null 設(shè)置False則不能為null
# 5.label:標(biāo)簽,?于對(duì)字段顯示設(shè)置
# 6.help_text:對(duì)字段進(jìn)?解釋的?段?本,?于提示
# 7.style:說(shuō)明字段的類型
# 8.error_messages:字段出錯(cuò)時(shí),信息提示
- 創(chuàng)建user/serializers.py寫序列化器
'''
class User(AbstractUser):
phone = models.CharField('?機(jī)號(hào)',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) # 普通字段,設(shè)置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
# 定義創(chuàng)建語(yǔ)法:ser.save()執(zhí)?,就會(huì)?刻調(diào)?create?法?來(lái)創(chuàng)建數(shù)據(jù)
def create(self, validated_data):
'''
validated_data: 表單或者vue請(qǐng)求攜帶的json:
{"username":"zhangsan","password":"123456"}
'''
# http://www.rzrgm.cn/xiaonq/p/7978409.html
return User.objects.create(**validated_data)
# 定義更新?法
def update(self, instance, validated_data):
'''
instance : 查詢的對(duì)象
validated_data : postman提交的json數(shù)據(jù)
{"username":"zhangsan","password":"123456"}
'''
if validated_data.get('username'):
instance.username = validated_data['username']
instance.save()
return instance
# 定義單?字段驗(yàn)證的?法
def validate_username(self, value):
if value == 'root':
raise serializers.ValidationError('不能創(chuàng)建root管理員賬號(hào)')
return value
# 定義多字段驗(yàn)證?法
def validate(self, attrs):
print(attrs)
if attrs.get("username") == 'admin':
raise serializers.ValidationError('不能創(chuàng)建admin?戶')
return attrs
1.3 在user/views.py中添加視圖函數(shù)
from .models import User
from .serializers import UserSerializers
from rest_framework.views import APIView
from rest_framework.response import Response
class UserView(APIView):
# 查詢用戶信息
def get(self, request, *args, **kwargs):
# ?對(duì)多、多對(duì)多查詢都是?樣的語(yǔ)法
queryset = User.objects.all()
ser = UserSerializers(queryset, many=True) # 多條數(shù)據(jù)需要many=True
# ser = UserInfoSerializer(instance=obj[0]) # 關(guān)聯(lián)數(shù)據(jù)?個(gè)
return Response(ser.data)
# 創(chuàng)建用戶
def post(self, request):
data = request.data
ser = UserSerializers(data=data)
try:
# 判斷提交數(shù)據(jù)是否合法
ser.is_valid()
ser.save() # 保存
return Response({'code': 200, 'msg': '添加成功'})
except Exception as e:
# print(e)
print(ser.errors)
return Response({'code': 400, 'msg': '添加失敗'})
# 更新?戶信息
def put(self, request):
pk = request.query_params.get('pk') # 修改數(shù)據(jù)需要先知道修改那一條數(shù)據(jù)
try:
userinfo = User.objects.get(id=pk)
except:
return Response({'code': 400, 'msg': '用戶不存在'})
# 創(chuàng)建序列化對(duì)象,并將要反序列化的數(shù)據(jù)傳遞給data構(gòu)造參數(shù),進(jìn)而進(jìn)行驗(yàn)證
ser = UserSerializers(userinfo, data=request.data)
if ser.is_valid():
ser.save()
return Response({'code': 200, 'msg': '修改成功'})
return Response({'code': 400, 'errors': ser.errors})
#刪除數(shù)據(jù)
def delete(self, request):
pk = request.query_params.get('pk')
try:
#刪除不需要序列化直接查詢后刪除
User.objects.filter(id=pk).delete()
return Response({'code': 200, 'msg': '刪除成功'})
except:
return Response({'code': 400, 'msg': '刪除失敗'})
2.序列化正想反相查詢
http://www.rzrgm.cn/xiaonq/p/10987889.html#i3
3.測(cè)試接?
3.1 查詢所有?戶
http://192.168.56.100:8888/user/apiview/

3.2 創(chuàng)建?戶
http://192.168.56.100:8888/user/apiview/

3.3 更新?戶信息
http://192.168.56.100:8888/user/apiview/?pk=7

3.4 限流功能測(cè)試
http://192.168.56.100:8888/user/apiview/
'''修改syl/settings.py配置限速設(shè)置'''
REST_FRAMEWORK = {
#3.1 限流策略
'DEFAULT_THROTTLE_RATES': {
'user': '3/hour', # 認(rèn)證?戶每?時(shí)10次
'anon': '3/day',
},
}
從小白到大神的蛻變~~

浙公網(wǎng)安備 33010602011771號(hào)