drf 二

目录

1.反序列化
2.局部和全局钩子
3.序列化类常用字段属性
4.模型序列化全
5.请求对象(了解)
6.响应对象属性(了解)
7.回顾总结

1.反序列化

1 如果要反序列化,继承了Serializer,必须重写create方法

2 使用
#视图类
def post(self, request):
    publish_ser = serializer.PublishSerializer(data=request.data)
    if publish_ser.is_valid():
        # 直接保存,保存到哪个表里?需要重写save
        publish_ser.save()
        return Response(publish_ser.data)
    else:
        
        return Response(publish_ser.error)
    
# 序列化类
def create(self, validated_data):
    res = models.Publish.objects.create(**validated_data)
    return res

2.局部和全局钩子

def validate_name(self, data):
       # data就是当前字段的值
       if data.startswith('sb'):
           raise ValidationError('不能以sb开头')
       else:
           return data

def validate(self, attrs):
       if attrs.get('name') == attrs.get('city'):
           raise ValidationError('city和名字不能一样')
       else:
           return attrs

3.序列化类常用字段属性

3.1 常用和非常用字段

http://www.liuqingzheng.top/python/Django-rest-framework%E6%A1%86%E6%9E%B6/2-drf-%E5%BA%8F%E5%88%97%E5%8C%96%E7%BB%84%E4%BB%B6/

3.2 字段参数

# 针对charfield
max_length  最大长度
min_lenght  最小长度
allow_blank 是否允许为空
# 针对interfield
max_value   最小值
min_value   最大值

# 通用的,大家都有
#这两个最重要
read_only   表明该字段仅用于序列化输出,默认False(序列化)
write_only  表明该字段仅用于反序列化输入,默认False(反序列化)


required    表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null  表明该字段是否允许传入None,默认False
error_messages  包含错误编号与错误信息的字典

validators  该字段使用的验证器(了解)

4.模型序列化全

4.1 视图类

from rest_framework.views import APIView
from rest_framework.response import Response
from restful import models
from restful import serializer


class BookViews(APIView):
    # 查询所有
    def get(self, request, *args, **kwargs):
        response = {'status': 200, 'msg': '查询'}
        try:
            # 取出数据库所有
            book_s = models.Book.objects.all()
            # 序列化全部
            books = serializer.BookModelSerializer(instance=book_s, many=True)  # many全部
            # book.data字典加入到data列表里
            response['data'] = books.data
        except Exception as e:
            # 返回错误信息
            response['msg'] = str(e)
        return Response(response)

    # 增加
    def post(self, request):
        response = {'status': 200, 'msg': '新增'}
        try:
            # data反序列化
            book_ser = serializer.BookModelSerializer(data=request.data)
            # 校验
            if book_ser.is_valid():
                # 保存
                book_ser.save()
                # book.data字典加入到data列表里
                response['data'] = book_ser.data
            else:
                # book.error错误信息加入到msg列表里
                response['msg'] = book_ser.errors
        except Exception as e:
            # 返回错误信息
            response['msg'] = str(e)
        return Response(response)


class BooksViewsId(APIView):
    # 查询一个
    def get(self, request, id):
        response = {'status': 200, 'msg': '查询'}
        try:
            # 取出id
            book_s = models.Book.objects.all().filter(pk=id).first()
            # 序列化
            book_k = serializer.BookModelSerializer(instance=book_s)
            # book.data字典加入到data列表里
            response['data'] = book_k.data
        except Exception as e:
            # 返回错误信息
            response['msg'] = str(e)
        return Response(response)

    # 修改数据
    def put(self, request, id):
        response = {'status': 200, 'msg': '修改'}
        try:
            # 取出id
            books_list = models.Book.objects.all().filter(pk=id).first()
            # 拿到id号反序列化
            book_ser = serializer.BookModelSerializer(instance=books_list, data=request.data)
            # 校验
            if book_ser.is_valid():
                # 保存
                book_ser.save()
                # book.data字典加入到data列表里
                response['data'] = book_ser.data
            else:
                # book.error错误信息加入到msg列表里
                response['msg'] = book_ser.errors
        except Exception as e:
            # 返回错误信息
            response['msg'] = str(e)
        return Response(response)
    
    # 删除
    def delete(self, request, id):
        # 查询到id号
        res = models.Book.objects.filter(pk=id).delete()
        # 判断第一个删除
        if res[0] > 0:
            return Response('')
        else:
            return Response('删除的不存在')

4.2 序列化类

from rest_framework import serializers
from restful import models
from rest_framework.exceptions import ValidationError


# 继承ModelSerializer类
class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        # __all__ 查询所有
        fields = '__all__'
        # 字段限制
        extra_kwargs = {
            'name': {'max_length': 6, 'required': True},
            'price': {'min_value': 0, 'required': True},
        }

    # 局部钩子
    def validate_name(self, data):
        # data就是当前字段的值
        if data.startswith('sb'):
            raise ValidationError('不能以sb开头')
        else:
            return data

    # 全局钩子
    def validate(self, attrs):
        if attrs.get('name') == attrs.get('price'):
            raise ValidationError('名字一样')
        else:
            return attrs

    # 重写字段
    publish = serializers.SerializerMethodField()
    # 字段详情,必须加get_字段名方法
    def get_publish(self, obj):
        return {'name': obj.publish.name, 'city': obj.publish.city}

    #  重写字段
    authors = serializers.SerializerMethodField()
    # 字段详情,必须加get_字段名方法
    def get_authors(self, obj):
        return [{'name': author.name, 'age': author.age} for author in obj.authors.all()]

4.3 路由

from restful import views
urlpatterns = [
path('books/<int:id>/', views.BooksViewsId.as_view()),
path('booka/', views.BookViews.as_view()),
]

4.4 settings配置app(注意记得配置数据库也可以用自带sqllite3)

INSTALLED_APPS = [
    'rest_framework'
]

4.5 models 表(注意迁移)

from django.db import models


class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField()

    publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE)
    authors = models.ManyToManyField(to='Author')

    def __str__(self):
        return self.name


class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDatail', to_field='nid', unique=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class AuthorDatail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)

    def __str__(self):
        return self.addr


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name

4.6 admin 配置(注意创建用户 createsuperuser)

from django.contrib import admin
from restful import models


admin.site.register(models.Book)
admin.site.register(models.Author)
admin.site.register(models.AuthorDatail)
admin.site.register(models.Publish)

5.请求对象(了解)

1 Request:新的request
2 常用属性

1).data
request.data 返回解析之后的请求体数据。类似于Django中标准的request.POST和 request.FILES属性,但提供如下特性:

包含了解析之后的文件和非文件数据
包含了对POST、PUT、PATCH请求方式解析后的数据
利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据
2).query_params
request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已

6.响应对象属性(了解)

#一直会用
data: 为响应准备的序列化处理后的数据(字典)
#偶尔会用
headers: 用于存放响应头信息的字典;
status: 状态码,默认200;(http请求的状态码)
    
# 基本不用  
template_name: 模板名称,如果使用HTMLRenderer 时需指明;
content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。

7.回顾总结

0 drf是django的一个app
    -序列化器
    -Request
    -Response
    -版本控制
    -认证,频率,权限
    -过滤,排序,分页
    -视图相关
    -自动生成接口文档(coreapi,swagger)
    -jwt做认证(第三方)
    -xadmin---》对admin的美化(bootstrap+jq,1.x版本),simple-ui
    -RBAC:基于角色的访问控制(公司内部项目)
    
    
1 序列化器
    1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串
    2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
    3. 反序列化,完成数据校验功能
    
2 Serializer
    -序列化
        -实例化序列化对象,many参数作用
        -source
        -SerializerMethodField
        -模型表中写方法    
    -反序列化
        -ser=BookSerializer(data=request.data)
        -数据校验:ser.is_valid()
        -存数据:手动存,重写BookSerializer的create方法,update方法
        -ser.save() 如果是新增,会调用create,如果是修改,会调用update
        -ser.data 如果有instance对象,就是对instance做序列化
        -全局,局部钩子,字段参数
3 ModelSerializer
    -class Meta:
        model=Book
        fields=‘__all__’
        extra_kwargs
    -重写某个字段:跟之前学的又一样了
    -子序列化
4 常用非常用字段
5 字段参数
6 如果第三张表是手动建的,authors是存不进去的
    {
    name:ddd
    price:10
    publish:1
    authors:[1,2]
    }
    
7 请求对象的属性
8 响应对象
    -data:响应数据
    -status:响应状态码
    -header:响应头
    -content_type:响应类型

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

推荐阅读更多精彩内容

  • drf使用记录(二) - 序列化器 简述 序列化:序列化器会把模型对象转换成字典,经过response以后变成js...
    憧憬001阅读 710评论 0 0
  • 7. 序列化器-Serializer 作用: 7.1 定义序列化器 Django REST framework中的...
    childhood_1013阅读 153评论 0 0
  • java面试宝典2018 1、[ meta标签的作用是什么](http://www.wityx.com/post/...
    Sina华阅读 435评论 1 2
  • 第一部分 Python基础篇(80题) 1、为什么学习Python? Python相对于其他编程语言有很多优点: ...
    清清子衿木子水心阅读 1,704评论 0 1
  • 欢迎关注公众号“Tim在路上” 1.听说你对JVM有点研究,讲一讲JVM的内存模型吧(我说虚拟机栈,本地方法栈,程...
    Tim在路上阅读 3,533评论 4 91