本文主要系统性的讲解django rest framwork 序列化组件的使用,基本看完可以解决工作中序列化90%的问题,写作参考官方文档https://www.django-rest-framework.org/api-guide/serializers/#modelserializer,分成如下九个部分:
01、为什么要用序列化组件
我们知道前后端常用json数据结构交互, 在后端我们常想把一个对象返回给前端,但是json序列化是不能序列化对象(不过可以添加序列化参数encoder序列化原理和序列化组件差不多需要自己定义序列化类和返回的结构),所以就有了我们的序列化组件,可以自定义特定结构把对象序列化返回给前端,同时可以对前端传入的参数进行数据校验等功能。
02、序列化组件的基本使用
models
from django.db import models # Create your models here. class Book(models.Model): id = models.IntegerField(primary_key=True) title = models.CharField(max_length=255) desc = models.CharField(max_length=255) is_deleted = models.IntegerField(choices=[(1, "删除"), (0, "未删除")]) author = models.CharField(max_length=255)
serializer
from rest_framework.serializers import Serializer from rest_framework import serializers class BookSerializer(Serializer): id = serializers.IntegerField() title = serializers.CharField() desc = serializers.CharField() is_deleted = serializers.ChoiceField(choices=[(1, "删除"), (0, "未删除")], source<strong>本文来源gaodai#ma#com搞@代~码^网+</strong>="get_is_deleted_display") author = serializers.CharField()
views
from app01.models import Book from app01.serializer import BookSerializer from django.http import HttpResponse, JsonResponse # Create your views here. def get_books(request): books = Book.objects.all() se = BookSerializer(books, many=True) return JsonResponse(se.data, safe=False)
结果返回:
[{“id”: 1, “title”: “活着”, “desc”: “讲述一代人的人生”, “is_deleted”: “未删除”, “author”: “余华”}]
在写法上model和serializer的写法非常相近,但内在逻辑model是与数据库表的关系映射,serializer是对对象的序列化和反序列化。
03、序列化组件常用字段
常用字段类型
字段 | 字段构造方式 |
---|---|
BooleanField | BooleanField() |
NullBooleanField | NullBooleanField() |
CharField | CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) |
EmailField | EmailField(max_length=None, min_length=None, allow_blank=False) |
RegexField | RegexField(regex, max_length=None, min_length=None, allow_blank=False) |
SlugField | SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+ |
URLField | URLField(max_length=200, min_length=None, allow_blank=False) |
UUIDField | 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 | IPAddressField(protocol=’both’, unpack_ipv4=False, **options) |
IntegerField | IntegerField(max_value=None, min_value=None) |
FloatField | FloatField(max_value=None, min_value=None) |
DecimalField | DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置 |
DateTimeField | DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None) |
DateField | DateField(format=api_settings.DATE_FORMAT, input_formats=None) |
TimeField | TimeField(format=api_settings.TIME_FORMAT, input_formats=None) |
DurationField | DurationField() |
ChoiceField | ChoiceField(choices) choices与Django的用法相同 |
MultipleChoiceField | MultipleChoiceField(choices) |
FileField | FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ImageField | ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ListField | ListField(child=, min_length=None, max_length=None) |
DictField | DictField(child=) |