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__"
or
class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = ("id", "click_num") # only list part of Product attributes, not all of them
見: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__"
