drf序列化器serializer的具体使用

1. 引言

在Django中,RESTful API十分流行,而在RESTful API开发中,数据的序列化和反序列化是一个重要的问题。如果我们用Django开发RESTful API的话,推荐使用Django REST framework(简称DRF)。DRF为Django开发者提供了很多便利的功能,其中一个就是提供了序列化器(serializer)类,下面我们详细介绍一下DRF序列化器的使用。

2. 什么是序列化器

序列化器是DRF中的一个重要组件,主要用于将复杂的Python数据类型(如Model实例)转换成Python默认数据类型(如dict或list),以便于序列化成JSON、XML等格式。另外,序列化器还可以进行反序列化,将JSON或XML格式的数据反序列化成Python数据类型,以方便应用程序使用。

2.1 序列化器能做什么

序列化器可以完成如下任务:

将Model实例转化为Python字典,以便于序列化成JSON格式。

将Python字典反序列化成Model实例。

验证序列化数据是否合法。

支持嵌套和多个序列化器之间的切换,以便于创建复杂的API。

2.2 序列化器的类型

DRF序列化器有两种类型:ModelSerializer和Serializer。

2.2.1 ModelSerializer

ModelSerializer是针对Model的序列化器,它会自动根据Model生成对应的序列化器。在ModelSerializer中,我们只需要设置Meta类中的model属性,再定义一个fields属性,即可以实现Model实例和dict类型之间的转换。

2.2.2 Serializer

Serializer是针对Python数据类型的序列化器,它需要手动定义序列化和反序列化规则。Serializer需要定义各个字段,并为每个字段定义序列化和反序列化规则,比如required、allow_null、default等等。

3. 序列化器的使用

为了演示序列化器的使用,下面我们以一个简单的例子来说明。

3.1 创建模型

我们先创建一个简单的模型:

from django.db import models

class Book(models.Model):

name = models.CharField(max_length=100)

publish_time = models.DateTimeField()

price = models.FloatField()

3.2 定义序列化器

我们使用ModelSerializer来定义序列化器。在这里,我们只设置了Meta类中的model属性和fields属性。

from rest_framework import serializers

from .models import Book

class BookSerializer(serializers.ModelSerializer):

class Meta:

model = Book

fields = '__all__'

3.3 序列化器的使用

我们通过以下代码完成模型实例和dict类型之间的转换。

from django.shortcuts import render

from rest_framework.response import Response

from rest_framework.views import APIView

from .serializers import BookSerializer

from .models import Book

class BookView(APIView):

def get(self, request):

books = Book.objects.all()

serializer = BookSerializer(books, many=True)

return Response(serializer.data)

def post(self, request):

serializer = BookSerializer(data=request.data)

if serializer.is_valid():

serializer.save()

return Response(serializer.data)

return Response(serializer.errors)

在get请求中,我们将所有的Book实例序列化并返回。在post请求中,我们将接收到的数据反序列化并保存到数据库中。

4. 序列化器的字段

4.1 字段的类型

DRF提供了很多种字段类型,下面我们介绍一些常用的字段类型。更多的字段类型可以参考官方文档

4.1.1 CharField

CharField用于序列化和反序列化字符串类型的数据。

class BookSerializer(serializers.ModelSerializer):

name = serializers.CharField(max_length=100)

publish_time = serializers.DateTimeField()

price = serializers.FloatField()

class Meta:

model = Book

fields = '__all__'

4.1.2 IntegerField

IntegerField用于序列化和反序列化整数类型的数据。

class BookSerializer(serializers.ModelSerializer):

price = serializers.IntegerField()

class Meta:

model = Book

fields = '__all__'

4.1.3 FloatField

FloatField用于序列化和反序列化浮点数类型的数据。

class BookSerializer(serializers.ModelSerializer):

price = serializers.FloatField()

class Meta:

model = Book

fields = '__all__'

4.1.4 BooleanField

BooleanField用于序列化和反序列化布尔类型的数据。

class BookSerializer(serializers.ModelSerializer):

is_on_sale = serializers.BooleanField()

class Meta:

model = Book

fields = '__all__'

4.1.5 DateTimeField

DateTimeField用于序列化和反序列化时间类型的数据。

class BookSerializer(serializers.ModelSerializer):

publish_time = serializers.DateTimeField()

class Meta:

model = Book

fields = '__all__'

4.2 序列化器的可选参数

序列化器的字段还可以设置一些可选参数,下面我们介绍一些常用的可选参数。

4.2.1 required

required用于表示该字段是否必填。

class BookSerializer(serializers.ModelSerializer):

name = serializers.CharField(max_length=100, required=True)

publish_time = serializers.DateTimeField()

price = serializers.FloatField()

class Meta:

model = Book

fields = '__all__'

4.2.2 allow_null

allow_null用于表示该字段是否可以为null。

class BookSerializer(serializers.ModelSerializer):

name = serializers.CharField(max_length=100, allow_null=True)

publish_time = serializers.DateTimeField()

price = serializers.FloatField()

class Meta:

model = Book

fields = '__all__'

4.2.3 default

default用于表示该字段的默认值。

class BookSerializer(serializers.ModelSerializer):

name = serializers.CharField(max_length=100, default='unknown')

publish_time = serializers.DateTimeField(default=datetime.datetime.now)

price = serializers.FloatField()

class Meta:

model = Book

fields = '__all__'

5. 结语

DRF序列化器是一个非常有用的工具,它可以方便地将Model实例转换成Python字典,并支持对字典的反序列化。同时,DRF序列化器还支持自定义字段,以及字段的可选参数,方便我们对API进行灵活的配置。希望这篇文章能够对大家学习DRF序列化器有所帮助。

后端开发标签