Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数

常用字段

字段名 字段参数
CharField max_length=None, min_length=None, allow_blank=False, trim_whitespace=True
IntegerField max_value=None, min_value=None
FloatField max_value=None, min_value=None
BooleanField
NullBooleanField
FloatField max_value=None, min_value=None
DecimalField max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None 注:max_digits: 最多位数 decimal_palces: 小数点位置
TimeField format=api_settings.TIME_FORMAT, input_formats=None
DateField format=api_settings.DATE_FORMAT, input_formats=None
DateTimeField format=api_settings.DATETIME_FORMAT, input_formats=None)
EmailField max_length=None, min_length=None, allow_blank=False
RegexField regex, max_length=None, min_length=None, allow_blank=False
SlugField max_length=50, min_length=None, allow_blank=False),正则字段,验证正则模式 [a-zA-Z0-9-]+
URLField max_length=200, min_length=None, allow_blank=False
UUIDField format='hex_verbose') format: 1) 'hex_verbose' 如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex' 如 "5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
IPAddressField protocol='both', unpack_ipv4=False, **options)
DurationField
ChoiceField choices,choices与Django的用法相同
MultipleChoiceField choices
FileField max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL
ImageField max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL
ListField child=, min_length=None, max_length=None
DictField child=

常用字段参数

CharField及子类的(EmailField)

反序列化的校验,字段自己的规则

参数 含义
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符

IntegerField

参数 含义
max_value 最小值
max_value 最大值

字段共有参数

参数 含义
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
validators 该字段使用的验证器
error_messages 包含错误编号与错误信息的字典
label 于HTML展示API页面时,显示的字段名称
help_text 用于HTML展示API页面时,显示的字段帮助提示信息
read_only 表明该字段仅用于序列化输出,默认False
write_only 表明该字段仅用于反序列化输入,默认False

二、序列化高级用法之source(了解)

首先先创建一个django项目,创建book表、publish表、以及author表,并建立三个表之间的关系,完成模型表数据的迁移并录入数据

python 复制代码
from django.db import models


# Create your models here.


class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    # 外键字段书与出版社一对多,关联字段在多的一方
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)

    # 书与作者多对多,需要创建中间表,使用全自动创建第三张表
    authors = models.ManyToManyField(to='Author')


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)


class Author(models.Model):
    name = models.CharField(max_length=32)
    phone = models.IntegerField()

序列化字段名

sourse

  • 可以定制序列化字段名
  • 防止数据被人篡盗,将前端展示的字段名和后端数据的字段名设置成不同的字段名

sourse序列化自有字段和关联字段的区别

python 复制代码
1.自有字段,直接写表字段名
publish_name = serializers.CharField(max_length=12, min_length=3, required=True, allow_blank=True,source='name')

2.还可以直接映射方法
models.py
class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)

    def sb_name(self):
        return self.name+'sb'

serializer.py
publish_name = serializers.CharField(max_length=12, min_length=3, required=True, allow_blank=True,source='sb_name')

3.关联字段  通过外键获取
    一对多  一对多的关联,直接点
        publish=serializers.CharField(max_length=8,source='publish.name')
    多对多  source不能用实现定制序列化关联表的字段
        authors = serializers.CharField(source='authors.all')

作业之装饰器

python 复制代码
def outer(func):
    def inner(request, *args, **kwargs):
        try:
            request.data = json.loads(request.body)  # 如果json格式不可以序列化loads
        except Exception as e:
            request.data = request.POST
            if request.method == 'PUT':
                body_in = str(request.body, encoding='utf-8')  # 转 译
                body_in = parse.unquote(body_in)
                # request.data = {i.split('=')[0]: i.split('=')[1] for i in body_in.split('&')}  # 字典推导式

                # 笨方法
                d = {}
                sp_1 = body_in.split('&')
                for i in sp_1:
                    k, v = i.split('=')
                    d[k] = v
                request.data = d
        res = func(request, *args, **kwargs)
        return res

    return inner


@outer
def index(request):
    print(request.data)
    return JsonResponse({'code': '请求成功'})

该装饰器只针对视图函数,如果要装饰在类的方法上就需要添加形参中添加self参数

作业之用户一次性提交数据

python 复制代码
views.py

from .serializer import AuthorSerializer


class AuthorView(APIView):
    def post(self, request):
        ser = AuthorSerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100, 'msg': '创建成功'})
        else:
            return Response({'code': 100, 'msg': ser.errors})
python 复制代码
serializer.py

class AuthorSerializer(serializers.ModelSerializer):
    telephone = serializers.CharField()
    birthday = serializers.CharField()
    addr = serializers.CharField()

    class Meta:
        model = Author
        fields = ['name', 'age', 'telephone', 'birthday', 'addr']

    def create(self, validated_data):  # 因为author表里没有authordetail其它三个字段,需要重写
        telephone = validated_data.pop('telephone')
        birthday = validated_data.pop('birthday')
        addr = validated_data.pop('addr')

        # 先创建作者详情,在创建作者,因为外键字段的约束,是现有作者详情,再有作者约束
        author_detail = AuthorDetail.objects.create(telephone=telephone, birthday=birthday, addr=addr)
        validated_data['author_detail'] = author_detail
        author = Author.objects.create(**validated_data)

        return author
相关推荐
喵叔哟25 分钟前
重构代码之移动字段
java·数据库·重构
念白44328 分钟前
智能病历xml提取
数据库·sql·oracle
qingy_204632 分钟前
【JavaWeb】JavaWeb入门之XML详解
数据库·oracle
大数据面试宝典36 分钟前
用AI来写SQL:让ChatGPT成为你的数据库助手
数据库·人工智能·chatgpt
努力的小雨41 分钟前
快速上手 KSQL:轻松与数据库交互的利器
数据库·经验分享
Gentle58643 分钟前
labview中连接sql server数据库查询语句
数据库·labview
Gentle5861 小时前
labview用sql server数据库存取数据到一个单元格
数据库·labview
2401_857636391 小时前
共享汽车管理新纪元:SpringBoot框架应用
数据库·spring boot·汽车
菲兹园长1 小时前
表的设计(MYSQL)
数据库·mysql
Java Fans1 小时前
MySQL数据库常用命令大全(完整版——表格形式)
数据库·mysql