APIview+Serializers使用
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寫序列化器
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-biDtLCkF-1603884128018)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20201028145517805.png)]
#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_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#i
3.測試介面
3.1 查詢所有使用者
http://192.168.56.100:8888/user/apiview/
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-QkgYQYcZ-1603884128019)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20201028150348347.png)]
3.2 建立使用者
http://192.168.56.100:8888/user/apiview/
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-71wMFVop-1603884128023)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20201028150406441.png)]
3.3 更新使用者資訊
http://192.168.56.100:8888/user/apiview/?pk=7
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-7LAmaA3H-1603884128028)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20201028150430249.png)]
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',
},
}
ser/apiview/
'''修改syl/settings.py配置限速設定'''
REST_FRAMEWORK = {
#3.1 限流策略
'DEFAULT_THROTTLE_RATES': {
'user': '3/hour', # 認證使用者每小時 10 次
'anon': '3/day',
},
}
相關文章
- APIView+Serializers的使用APIView
- laravel使用EasyWeChat 使用Laravel
- 使用FTP限制使用者FTP
- 配置vsftpd匿名使用服務,個人使用者使用以及虛擬使用者使用配置細節!FTP
- Laravel passport 多端使用者使用LaravelPassport
- 使用 CSS 追蹤使用者CSS
- mongodb使用者與角色使用MongoDB
- RecyclerView使用指南(四)—— 使用ItemDecorationView
- RecyclerView使用指南(一)—— 基本使用View
- 使用dwebsocket在Django中使用WebsocketWebDjango
- 限制使用者使用session數Session
- 使用Index提示 強制使用索引Index索引
- ImageJ使用教程(一):開始使用
- winscp使用教程多使用者,winscp使用教程多使用者,教程詳情
- vi/vim使用進階: 在VIM中使用GDB除錯 – 使用vimgdb除錯
- 使用jquery和使用框架的區別jQuery框架
- Docker 使用者操作使用說明Docker
- 儘量使用 useReducer,不要使用 useStateuseReducer
- PyCharm使用技巧(六):Regullar Expressions的使用PyCharmExpress
- 使用Bootstrap tab頁切換的使用boot
- Urllib庫的使用一---基本使用
- 使用PyCharm引入需要使用的包PyCharm
- 使用 JWT 認證使用者身份JWT
- 使用者授權,策略的使用
- 使用普通使用者執行 dockerDocker
- 熟練使用使用jQuery Promise (Deferred)jQueryPromise
- mongoDB使用詳解(在node中使用)MongoDB
- 使用Git管理專案 使用總結Git
- Scrapy框架的使用之Scrapyrt的使用框架
- openfire使用自定義使用者表
- Bitbucket使用說明與SourceTree的使用
- 使用非oracle使用者建立databaseOracleDatabase
- Portage使用者使用指南(轉)
- Mac使用root使用者登入Mac
- 使用者組和使用者
- jumpserver 使用者,系統使用者和管理使用者 普通使用者和特權使用者 區別Server
- MongoDB 使用MongoDB
- Mongodb使用MongoDB