Serializer序列化的基本使用

1.首先在bookmanager项目中创建book_drf的子应用,用于测试rest_framework的应用

python manage.py startapp book_drf

python中定义Serializer

1. 定义方法

Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。

例如,我们已有了一个数据库模型类BookInfo

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期', null=True)
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    image = models.ImageField(upload_to='booktest', verbose_name='图片', null=True)

我们想为这个模型类提供一个序列化器,可以定义如下:

class BookInfoSerializer(serializers.Serializer):
    """图书数据序列化器"""
    id = serializers.IntegerField(label='ID', read_only=True)
    btitle = serializers.CharField(label='名称', max_length=20)
    bpub_date = serializers.DateField(label='发布日期', required=False)
    bread = serializers.IntegerField(label='阅读量', required=False)
    bcomment = serializers.IntegerField(label='评论量', required=False)
    image = serializers.ImageField(label='图片', required=False)

注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。

2.在book_drf目录下创建serializer.py文件,准备用于序列化,为了节省时间,测试只定义了3个字段,故会返回3个字段的数据,实际代码如下:

from rest_framework import serializers


# 自定义序列化器
class BookSerialzier(serializers.Serializer):
    # 序列化返回字段
    btitle = serializers.CharField()
    bread = serializers.IntegerField()
    bpub_date = serializers.DateField()

3.在book_drf目录下views.py文件代码如下:

from django.http import JsonResponse
from django.views import View

from book_drf.serializer import BookSerialzier
from books.models import BookInfo


class Books(View):
    def get(self, request):
        # 1、查询所有图书对象
        books = BookInfo.objects.all()
        ser = BookSerialzier(books, many=True)
        return JsonResponse(ser.data, safe=False)


class Book(View):

    def get(self, request):
        book = BookInfo.objects.get(id=1)
        ser = BookSerialzier(book)

        return JsonResponse(ser.data)

4.配置在book_drf目录下urls.py文件的路由代码如下(测试serializer序列化):

from django.conf.urls import url
from . import views
urlpatterns = [
    # 配置查询所有图书路由
    url(r'^books_drf/$', views.Books.as_view()),
    # 配置查询一本书的路由
    url(r'^book_drf/$', views.Book.as_view()),
]

配置bookmanager目录下的urls.py文件中的路由代码如下:

from django.conf.urls import url, include

urlpatterns = [
    url(r'^', include('books.urls')),
    # 配置测试book_drf序列化框架路由
    url(r'^', include('book_drf.urls')),
]

注意事项:

序列化多条数据代码是:

ser = BookSerialzier(books, many=True)

序列化一条数据代码是:

ser = BookSerialzier(book)

返回多条数据代码是:

return JsonResponse(ser.data, safe=False)

返回一条数据代码是:

return JsonResponse(ser.data)