模型类序列化器

一、模型类序列化器的使用

1、原来用的Serilizer跟表模型没有直接联系,模型类序列化器ModelSerilizer,跟表模型有对应关系
2、ModelSerializer与常规的Serializer相同,但提供了:
(1)基于模型类自动生成一系列字段
(2)基于模型类自动为Serializer生成validators,比如unique_together
(3)包含默认的create()和update()的实现
3、具体使用

class BookModelSerializer(serializers.ModelSerializer):
    # publish = serializers.CharField(max_length=32,source='publish.name')  # 重写某些字段,例如显示名字
    class Meta:
        model = models.Book  # 跟哪个表模型建立关系
        fields = '__all__'   # 序列化的字段,反序列化的字段
        # exclude = ['title']  # 排除哪些字段(不能和fields同时使用)
        # depth = 1
        # read_only_fields=['price','publish']  # 序列化显示的字段
        # write_only_fields=['title']  # 反序列化需要传入的字段
        # extra_kwargs = {'title':{'max_length':32,'write_only':True}}
        # depth = 1   # 跨表查询,外键一个表就1,最多建议写3
        
        #局部钩子和全局钩子和BookSerializer一样

4、新增、修改
在模型类序列化器中统统不用重写create和update方法,在ModelSerializer内部已经重写了这两个方法

二、高级用法之SerializerMethodField

主要是为了拿到关联表中的字段数据

#Serializer中
class BookSerializer(serializers.Serializer):
    id = serializers.IntegerField(required=False)
    name = serializers.CharField(max_length=32,min_length=2,source='title')
    price = serializers.DecimalField(max_digits=5, decimal_places=2)
    publish = serializers.SerializerMethodField()
    def get_publish(self,obj):
        dic={'name':obj.publish.name,'addr':obj.publish.addr}
        return dic
#模型类序列化器中
class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'
    publish = serializers.SerializerMethodField()
    def get_publish(self,obj):
        dic={'name':obj.publish.name,'addr':obj.publish.addr}
        return dic
#使用序列化类的嵌套实现
class PublishSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Publish
        # fields = '__all__'
        fields = ['name','addr']

class BookModelSerializer(serializers.ModelSerializer):
    publish = PublishSerializer()
    class Meta:
        model = models.Book
        fields = '__all__'

三、drf的请求与响应

1、Request:
data:前端以post请求提交的数据都在它里面
FILES:前端提交的文件
query_params:就是原来的request.GET
内部重写了getattr:使用新的request.method其实就是原生request.method,原理是通过反射实现
2、Response
data:响应的字典
status:http响应的状态码(drf提供了所有的状态码,以及它的意思)
template_name:模板名字
headers:响应头,字典
content_type:响应的编码方式

四、自己手动封装了一个response,继承drf的Response

在app中创建一个名为utils.py的文件,自定义一个CommonResponse的类
#utils.py
class CommonResponse:
    def __init__(self):
        self.code = 100
        self.msg = ''
    @property
    def get_dic(self):
        return self.__dict__
#视图函数中导入自定义的类,再实例化,以后就可以用点取值
from app01.utils import CommonResponse
class BookDetail(APIView):
    def put(self,request,id,*args,**kwargs):
        # res = {'code':'修改成功','msg':''}
        res = CommonResponse()
        try:
            book = models.Book.objects.get(id = id)
            ser = BookModelSerializer(instance=book,data=request.data)           ser.is_valid(raise_exception=True)
            ser.save()
            # res['msg']='修改成功'
            # res['result']=ser.data
            res.msg = '修改成功'
        except Exception as e:
            # res['code'] = 101
            # res['msg'] = str(e)
            res.code = 101
            res.msg = str(e)
        return Response(res.get_dic)

五、配置模板

通过配置,选择默认模板的显示形式(浏览器方式,Json方式)

配置文件方式(全局)
REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
                'rest_framework.renderers.JSONRenderer',  # json渲染器
                'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
            )
            }
如果没有配置,默认有浏览器和json,drf中有默认配置文件
from rest_framework.settings import DEFAULTS

在视图类中配置(局部)
粒度更小
class BookDetail(APIView):
            renderer_classes=[JSONRenderer,]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343