DRF框架使用时的一些注意点

之前的文章代码块在安卓手机显示正常,但是苹果手机总是不能滚屏,非常影响阅读。今天总算解决了这个问题,苹果手机显示正常了。希望给大家带来最好的阅读体验。喜欢的话就点一下好看,关注一下本公众号吧。

1.格式化数据

我们想要将字典数据格式化显示(默认显示的是一个字典在一行,可读性比较差),可以按下面的代码将其调整:

# 格式化显示
import json
res = json.dumps(res_data, indent=4,ensure_ascii=False)
print(res)
----------------------
{
    "id": 1,
    "btitle": "射雕英雄传",
    "bpub_date": "1980-05-01",
    "bread": 12,
    "bcomment": 34,
    "image": null
}

indent代表的是缩进,ensure_ascii改为False可以将中文显示正常。

2.序列化器传值注意的小点

默认序列化器必须传递required的字段,否则会剖出验证异常。但是我们可以使用partial参数来允许部分字段更新。

data = {'btitle':'射雕英雄传'}
# 下面是创建序列化器对象
serializer = BookInfoSerializer(book,data=data,partial=True)

在里面,我们定义字段的时候,btitle和bpub_date是设置了required,是必传项。我们只传一个值的时候,在校验过程是会失败的。我们指定了partial参数为True的时候,就是允许我们只修改btitle部分,校验时是不会报错的。

3.反序列化器的save特殊用法

我们在反序列化数据的保存和更新的时候,调用的save方法是可以进行传值的

# 获取id为1的图书
    book = BookInfo.objects.get(id=1)
    data = {
        'btitle':'射雕英雄传2',
        'bpub_date':'1980-10-1'
    }
    # 创建序列化器对象
    serializer = BookInfoSerializer(book,data=data)
    # 调用is_valid方法进行数据校验
    print(serializer.is_valid())
    print(serializer.errors)
    # 反序列化-数据的保存
    # save里面是可以传递参数的,我们在调用create和update的时候也是可以取的到值的。
    serializer.save(a=1,b=3)

我们在调用save方法的时候,如果是新增数据的话,是调用了继承的父类的create方法,我们在序列化其类里面对其进行了重写;如果是更新数据的话,是调用了父类的update方法,我们在序列化器类里面也是对其进行了重写。

我们在save中进行传值的时候,这些额外的参数,在create和update被调用的时候也是接收的到的。

4.ModelSerializer的继承

使用:序列化器针对某个Django框架的模型类。

好处

1.依据模型类的字段自动生成序列化器类的字段

2.已经实现了create和update方法的代码

5.反序列化校验

反序列化校验数据的时候我们用到了is_valid方法:

serializer.is_valid(raise_exception=True)

其实这个方法是可以传参数的,传入上面的rasise_exception参数。它默认是为False的,也就是如果校验失败的时候,给我们返回False。如果我们将参数的值改为True,那么在校验失败的时候不会给我们返回False,而是直接报错。

有人说这功能鸡肋,其实根据具体的需求而定,大家了解即可。

6.序列化&反序列化

这两个概念很重要,多次强调也不为过,因此再强调一遍,让大家加深一下印象。

6.1序列化

序列化复杂的概念不需要记忆,因为也记不住,那么绕。我们只需要明白一点就好了:

序列化做的事情就是将我们查找出来的模型类对象转化成json数据(字典)的一个过程

对象---->json/字典

6.2反序列化

同理,我们还是记住下面的一句话即可

前端获取到的数据保存为模型类对象的一个过程。

json/字典---->对象