0 Django REST Framework 开发 ---- Serializer 与 ModelSerializer

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__"

猜你喜欢

转载自www.cnblogs.com/crazy-chinese/p/9828095.html