修改數據
1.傳入數據,選中data,以及修改data
book_ser = BookSerializer(instance=book, data=request.data)
2.校驗,通過則保存。
if book_ser.is_valid(): # 返回True 表示驗證通過book_ser.save() # 不是book.save() rest_framework提供
views.py,
# 修改用put 或patch,實際區分不大。def put(self, request, pk):response_msg = {'status': 100, 'msg': '成功'}# 找到對象book = Book.objects.filter(id=pk).first()# book_ser = BookSerializer(book,request.data)book_ser = BookSerializer(instance=book, data=request.data)# 要數據驗證if book_ser.is_valid(): # 返回True 表示驗證通過book_ser.save()response_msg['data'] = book_ser.dataelse:response_msg['status'] = 101response_msg['msg'] = '數據校驗失敗'response_msg['data'] = book_ser.errorsreturn Response(response_msg)
3. 序列化類里面重寫update
def update(self, instance, validated_data):# instance 是book這個對象# validated_data是校驗后的數據instance.name=validated_data.get('name')instance.price=validated_data.get('price')instance.author=validated_data.get('author')instance.publish=validated_data.get('publish')instance.save() # 相當于book.save() django 的orm提供return instance
校驗
1.局部鉤子
應用較多
在序列化類里面
def validate_price(self, data): #validate_字段名 接收一個參數# 如果價格小于10,就校驗不通過# print(type(data))# print(data)if float(data) > 10:return dataelse:# 校驗失敗,拋異常raise ValidationError('價格太低')
2.全局鉤子
少用
validate_data是全部數據,需要一個一個取出
def validate(self, validate_data):print(validate_data)author=validate_data.get('author')publish=validate_data.get('publish')if author == publish:raise ValidationError('作者名與出版社一樣')else:return validate_data
3. 字段內使用validators
author=serializers.CharField(validators=[check_author])
新寫函數:
def check_author(data):if data.startswith('sb'):raise ValidationError('作者名不能以sb開頭')else:return data
read_only和write_only
read_only
僅用于序列化輸出,默認false。如果設為True,
1.修改時(put)不需要傳入該字段。
2.postman查看(get)能看到該字段
write_only
僅用于反序列化輸入,默認false。如果設為True
1.修改時(put)需要該字段傳入。
2.postman查看(get)看不到該字段。
序列化字段參考參考:python/Django-rest-framework框架/2-drf-序列化組件 | Justin-劉清政的博客