Django之drf之二数据的修改与删除,字段的高级用法sour,模型类序列化器,高级。。。

更新时间:2023-07-01 06:23:07 阅读: 评论:0

Django之drf之⼆数据的修改与删除,字段的⾼级⽤法sour,模型类序
列化器,⾼级。。。
数据的修改与删除,字段的⾼级⽤法sour,模型类序列化器,⾼级⽤法之SerializerMethodField  drf的请求与响应 many=True源码分析,及局部全局钩⼦源码解析
⼀、修改,删除接⼝
views.py
def put(lf, request, id):
# 通过id取到对象
res = {'code': 100, 'msg': ''}
try:
book = models.(id=id)
r = BookSerializer(instance=book, data=request.data)
r.is_valid(rai_exception=True)
bridesmaid
r.save()
res['msg'] = '修改成功'
res['result'] = r.data
except Exception as e:
res['code'] = 101
res['msg'] = str(e)
return Respon(res)
def delete(lf,request,id):
respon = {'code': 100, 'msg': '删除成功'}
models.Book.objects.filter(id=id).delete()
return Respon(respon)
rializer.py
class BookSerializer(rializers.Serializer):
id = rializers.IntegerField(required=Fal)
title = rializers.CharField(max_length=32,min_length=2)
price = rializers.DecimalField(max_digits=5, decimal_places=2)
publish = rializers.CharField(max_length=32)
def create(lf, validated_data):
res=models.ate(**validated_data)
print(res)
return res
def update(lf, book, validated_data):
book.title=('title')
book.price=('price')
book.publish=('publish')
book.save()
return book
⼆、⾼级⽤法之source修改返回到前端的字段名
1.#source = title 字段名就不能叫title
#source = '字段名'  该字段名必须是表中拥有的,然后赋值给name(⾃⼰想要在前端看到的字段名)
name = rializers.CharField(max_length=32,min_length=2,source='title')
2 如果表模型中有⽅法
#执⾏表模型中的⽅法,并且把返回值赋值给xxx,且xxx这个变量名的命名不能与test相同
xxx = rializers.CharField(source='test')
3 source⽀持跨表操作
 addr = rializers.CharField(source='publish.addr')
有时间去看源码
3 模型类序列化器
1 原来⽤的Serilizer跟表模型没有直接联系,模型类序列化ModelSerilizer,跟表模型有对应关系
2 使⽤
  class BookModelSerializer(rializers.ModelSerializer):
    model=models.Book  (表模型)  #跟那个表模型建⽴关系
    fields=[字段,字段]    #序列化的字段,反序列化的字段
安寝
crush什么意思    fields='__all__'        #所有字段都序列化反序列化
    exclude=[字段,字段]      #排除那些字段(不能跟fields同时使⽤)
    read_only_fields=['price','publish'] #序列化显⽰的字段
    weite_only_fields=['title']  #反序列化需要传⼊的字段
    extra_kwargs = {'title':{'max_length':32,'write_only':True}}
    depth = 1 #了解,跨表1查询,最多建议写3
  #重写某些字段
  publish = rializers.CharField(max_length=32,source='publish.name')
  #局部钩⼦,全局钩⼦,跟原来完全⼀样
3 新增,修改
-统统不⽤重写create和update⽅法了,在ModelSerializer中重写了create和update
口才训练材料四⾼级⽤法之SerializerMethodField
class BookSerializer(rializers.Serializer):
id = rializers.IntegerField(required=Fal)
name = rializers.CharField(max_length=32,min_length=2,source='title')
price = rializers.DecimalField(max_digits=5, decimal_places=2)
publish = rializers.SerializerMethodField()  #必须与get_字段名⼀起使⽤
def get_publish(lf,obj): (需要2个参数,第⼆个参数obj是当前表的对象)
dic={'name':obj.publish.name,'addr':obj.publish.addr}
return dic
class BookModelSerializer(rializers.ModelSerializer):  #⽤ModelSerializer与上⾯⽤法相同class Meta:
model = models.Book
fields = '__all__'
    publish = rializers.SerializerMethodField()
def get_publish(lf,obj):
dic={'name':obj.publish.name,'addr':obj.publish.addr}
return dic
## 第三中⽅案,使⽤序列化类的嵌套(效果与上⾯⼀样)
class PublishSerializer(rializers.ModelSerializer):
    class Meta:
      model = models.Publish
      # fields = '__all__'
      fields = ['name','addr']
g queen
class BookModelSerializer(rializers.ModelSerializer):
    publish = PublishSerializer()
    class Meta:
    model = models.Book
    fields = '__all__'
五、drf的请求与响应
#Request
-data:前端以post提交的数据都在它中
在线英语的学习效果怎么样呢-FILES: 前端提交的⽂件
-query_params:就是原来的request.GET
-重写了__getattr__
-
使⽤新的hod其实取得就是原⽣hod(通过反射实现)
# Respon
-from spon import Respon
responsible-data:响应的字典
-status:http响应的状态码
-drf提供给你了所有的状态码,以及它的意思
from rest_framework.status import HTTP_201_CREATED
-template_name:模板名字(⼀般不动),了解
-headers:响应头,字典
-content_type:响应的编码⽅式,了解
# ⾃⼰封装⼀个Respon对象
class CommonRespon:
def__init__(lf):
lf.msg=''
@property
def get_dic(lf):
return lf.__dict__
# ⾃⼰封装⼀个respon,继承drf的Respon生产工艺英文
# 通过配置,选择默认模板的显⽰形式(浏览器⽅式,json⽅式)
-配置⽂件⽅式(全局)
-如果没有配置,默认有浏览器和json
-
drf有默认配置⽂件
from ings import DEFAULTS
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
'derers.JSONRenderer',  # json渲染器
'derers.BrowsableAPIRenderer',  # 浏览API渲染器
)
}
-在视图类中配置(局部)
-粒度更⼩
-class BookDetail(APIView):
renderer_class=[JSONRenderer,]
六、 many=True源码分析,局部全局钩⼦
1 many=True日语二级听力下载
-__init__----->⼀路找到了BaSerializer---》__new__决定了⽣成的对象是谁
# __new__如果有many会⽣成⼀个类似于列表的对象,列表内放置了多个rializer,没有会⽣成单个的rializer对象
2 ⼊⼝是is_valid()---》BaSerializer--》is_valid---》lf._validated_data = lf.run_validation(lf.initial_data)
-Serializer这个类的:lf.run_validation
"""
is_valid可以在BaSerializer类中找到在is_valid中有 lf._validated_data = lf.run_validation(lf.initial_data)(可以在Serializer类中找到)
value = lf.to_internal_value(data)(data指的是字段的值)在该⽅法中,通过循环判断是否有局部钩⼦,如果有进⾏局部校验,有报错,通过Except接收返回,没有直接返回该字段值。
"""
def run_validation(lf, data=empty):
value = lf.to_internal_value(data)  # 局部字段⾃⼰的校验和局部钩⼦校验
try:
lf.run_validators(value)
value = lf.validate(value)  # 全局钩⼦的校验
except (ValidationError, DjangoValidationError) as exc:
兴高采烈地rai ValidationError(detail=as_rializer_error(exc))
return value

本文发布于:2023-07-01 06:23:07,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/163359.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:局部   响应   序列化   模型   字段名
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图