Django REST Framework 中提供了很多种 Serializer 类, 在这里只介绍两种最常见的序列化类。
注: 本文是 Django REST Framework 系列第一篇文章,后边的文章会反复用到这里出现的 ProductSerializer
Serializer
使用 Serializer 可以将 queryset, model 实例等复杂数据类型(complex types)序列化成原生的 python 数据结构,且将其渲染成 JSON,XML 等其他数据类型。 Serializers 也可以反序列化,可将输入数据验证后,解析成复杂数据类型。
Django REST Framework 中的 serializers 工作方式与 Django 的 Form 和 ModelForm 及其相似。Serializer 类提供了强大的通用方式控制了响应的输出,而 ModelSerializer 类则针对 model 实例以及 queryset 封装了大量便捷的方法,使开发变得更加容易,简洁。
详见:https://www.django-rest-framework.org/api-guide/serializers/
如下面代码所示。
首先建立 serializer.py 文件,引入 serializers,从Model 中引入预先定义好的 Product (比如 Product 包括 id, desc, click_num, add_time 等字段)。然后建立新类,且集成 serializers.Serializer。其中对 id,desc,click_num 进行数据输入认证。使用 create 方法将合法输入的数据写入数据库Product表中。
1 from rest_framework import serializers 2 from products.models import Product 3 4 5 class ProductSerializer(serializers.Serializer): 6 id = serializers.IntegerField(read_only=True) 7 desc = serializers.CharField(required=False, allow_blank=True, max_length=100) 8 click_num = serializers.IntegerField(default=0) 9 10 def create(self, validated_data): 11 """ 12 Create and return a new `Product` instance, given the validated data. 13 """ 14 return Product.objects.create(**validated_data)
ModelSerializer
ModelSerializer 类似于 ModelForm 提供了一些便捷的方法,使你可以自动对 Django Model 中包含的部分或所有字段序列化。
用法上 ModelSerializer 和 Serializer 基本相同,除下面几点外:
- 在 Model 字段的基础上自动生成序列化字段
- 自动生成对 unique_together 的 validators
- 自动包含基础的 .create(), update() 的实现
1 class ProductSerializer(serializers.ModelSerializer): 2 class Meta: 3 Model = Product 4 Fields = "__all__"
见:https://www.django-rest-framework.org/api-guide/serializers/#modelserializer
如果被序列化的 Models 带有外键,比如:
Product 表中含有 category (表 Category 的主键)
Product:
product_id, title, click_num, category(fk), price, cost
Category:
category, desc
用以下方法可以显示出某 Product 和 Category 所有关联信息:
1 class CategorySerializer(serializers.ModelSerializer): 2 class Meta: 3 Model = Category 4 Fields = "__all__" 5 6 7 class ProductSerializer(serializers.ModelSerializer): 8 category = CategorySerializer() # 通过这种实例化方式,Category 的所有字段信息都会以 JSON 的形式嵌入到输出中 9 class Meta: 10 Model = Product 11 Fields = "__all__"