马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
BaseSerializer 是 Django REST framework (DRF) 中的一个核心类,用于将复杂的数据范例(如查询集和模型实例)转换为 Python 数据范例,以便于渲染成 JSON、XML 或其他内容范例。BaseSerializer 是所有序列化器的基类,提供了一些常用的方法和属性。以下是一些常用的方法和属性的先容:
常用方法
- to_representation(instance)
- 描述: 将模型实例或查询集转换为原生 Python 数据范例。
- 用途: 用于序列化数据,即将复杂数据范例转换为简单的、可序列化的数据范例。
- 示例:
- def to_representation(self, instance):
- return {
- 'id': instance.id,
- 'name': instance.name,
- 'email': instance.email,
- }
复制代码
- to_internal_value(data)
- 描述: 将原生数据(通常是字典)转换为验证后的数据。
- 用途: 用于反序列化数据,即将简单的、可序列化的数据范例转换为复杂的数据范例。
- 示例:
- def to_internal_value(self, data):
- return {
- 'id': data.get('id'),
- 'name': data.get('name'),
- 'email': data.get('email'),
- }
复制代码
- validate(attrs)
- 描述: 对输入数据举行验证。
- 用途: 用于自定义验证逻辑。
- 示例:
- def validate(self, attrs):
- if 'email' in attrs and not attrs['email'].endswith('@example.com'):
- raise serializers.ValidationError("Email must be from the domain 'example.com'.")
- return attrs
复制代码
- create(validated_data)
- 描述: 利用验证后的数据创建并返回一个新实例。
- 用途: 用于处理惩罚创建操作。
- 示例:
- def create(self, validated_data):
- return MyModel.objects.create(**validated_data)
复制代码
- update(instance, validated_data)
- 描述: 利用验证后的数据更新并返回一个现有实例。
- 用途: 用于处理惩罚更新操作。
- 示例:
- def update(self, instance, validated_data):
- instance.name = validated_data.get('name', instance.name)
- instance.email = validated_data.get('email', instance.email)
- instance.save()
- return instance
复制代码
常用属性
- data
- 描述: 返回序列化后的数据。
- 用途: 用于获取序列化后的数据。
- 示例:
- serializer = MySerializer(instance)
- serialized_data = serializer.data
复制代码
- errors
- 描述: 返回验证错误信息。
- 用途: 用于获取验证错误信息。
- 示例:
- serializer = MySerializer(data=request.data)
- if not serializer.is_valid():
- errors = serializer.errors
复制代码
- is_valid(raise_exception=False)
- 描述: 检查数据是否有效。
- 用途: 用于验证数据。
- 示例:
- serializer = MySerializer(data=request.data)
- if serializer.is_valid():
- # Data is valid
- else:
- # Data is not valid
复制代码
- validated_data
- 描述: 返回验证后的数据。
- 用途: 用于获取验证后的数据。
- 示例:
- serializer = MySerializer(data=request.data)
- if serializer.is_valid():
- validated_data = serializer.validated_data
复制代码
- initial_data
- 描述: 返回初始化时传入的原始数据。
- 用途: 用于获取初始化时传入的原始数据。
- 示例:
- serializer = MySerializer(data=request.data)
- initial_data = serializer.initial_data
复制代码
下面通过一个详细的示例来展示如安在实际应用中利用 BaseSerializer 中的常用方法。假设有一个简单的 Django 模型 Book,我们将创建一个序列化器 BookSerializer 来演示这些方法的实际用法。
模型定义
首先定义一个简单的 Book 模型:
- from django.db import models
- class Book(models.Model):
- title = models.CharField(max_length=100)
- author = models.CharField(max_length=100)
- published_date = models.DateField()
- isbn = models.CharField(max_length=13, unique=True)
复制代码 序列化器定义
接下来定义一个 BookSerializer,并在其中利用 BaseSerializer 的常用方法:
- from rest_framework import serializers
- from .models import Book
- class BookSerializer(serializers.Serializer):
- title = serializers.CharField(max_length=100)
- author = serializers.CharField(max_length=100)
- published_date = serializers.DateField()
- isbn = serializers.CharField(max_length=13)
- def to_representation(self, instance):
- """将模型实例转换为原生 Python 数据类型"""
- return {
- 'title': instance.title,
- 'author': instance.author,
- 'published_date': instance.published_date,
- 'isbn': instance.isbn,
- }
- def to_internal_value(self, data):
- """将原生数据转换为验证后的数据"""
- return {
- 'title': data.get('title'),
- 'author': data.get('author'),
- 'published_date': data.get('published_date'),
- 'isbn': data.get('isbn'),
- }
- def validate(self, attrs):
- """对输入数据进行验证"""
- if len(attrs['isbn']) != 13:
- raise serializers.ValidationError("ISBN must be 13 characters long.")
- return attrs
- def create(self, validated_data):
- """使用验证后的数据创建并返回一个新实例"""
- return Book.objects.create(**validated_data)
- def update(self, instance, validated_data):
- """使用验证后的数据更新并返回一个现有实例"""
- instance.title = validated_data.get('title', instance.title)
- instance.author = validated_data.get('author', instance.author)
- instance.published_date = validated_data.get('published_date', instance.published_date)
- instance.isbn = validated_data.get('isbn', instance.isbn)
- instance.save()
- return instance
复制代码 例子1
序列化数据
将 Book 模型实例序列化为 JSON 格式:
- from .models import Book
- from .serializers import BookSerializer
- # 假设我们有一个 Book 实例
- book_instance = Book.objects.get(id=1)
- # 序列化
- serializer = BookSerializer(book_instance)
- serialized_data = serializer.data
- print(serialized_data)
复制代码 反序列化数据
将 JSON 数据反序列化为 Book 模型实例:
- from .serializers import BookSerializer
- # 假设我们有一些 JSON 数据
- json_data = {
- 'title': 'New Book',
- 'author': 'John Doe',
- 'published_date': '2023-10-01',
- 'isbn': '1234567890123'
- }
- # 反序列化
- serializer = BookSerializer(data=json_data)
- if serializer.is_valid():
- book_instance = serializer.save()
- print(book_instance)
- else:
- print(serializer.errors)
复制代码 更新实例
利用验证后的数据更新现有的 Book 实例:
- from .models import Book
- from .serializers import BookSerializer
- # 假设我们有一个 Book 实例
- book_instance = Book.objects.get(id=1)
- # 新的数据
- update_data = {
- 'title': 'Updated Book',
- 'author': 'Jane Doe',
- 'published_date': '2023-10-02',
- 'isbn': '1234567890123'
- }
- # 更新
- serializer = BookSerializer(book_instance, data=update_data)
- if serializer.is_valid():
- updated_instance = serializer.save()
- print(updated_instance)
- else:
- print(serializer.errors)
复制代码 验证数据
验证输入数据:
- from .serializers import BookSerializer
- # 一些无效的 JSON 数据
- invalid_data = {
- 'title': 'Invalid Book',
- 'author': 'John Doe',
- 'published_date': '2023-10-01',
- 'isbn': '1234567890' # ISBN 长度不正确
- }
- # 验证
- serializer = BookSerializer(data=invalid_data)
- if not serializer.is_valid():
- print(serializer.errors) # 输出验证错误信息
复制代码 例子2
好的,下面我将完善这个例子,假设有一个名为 StatPlatProjectData 的模型,并且我们盼望在序列化时删除某些字段(如 created_at、updated_at 和 executor),将利用 BasicSerializer 作为基类,并在 to_representation 方法中自定义序列化逻辑。
模型定义
首先定义 StatPlatProjectData 模型:
- from django.db import models
- class StatPlatProjectData(models.Model):
- name = models.CharField(max_length=100)
- description = models.TextField()
- executor = models.CharField(max_length=100)
- created_at = models.DateTimeField(auto_now_add=True)
- updated_at = models.DateTimeField(auto_now=True)
复制代码 序列化器定义
接下来定义 StatPlatProjectDataSerializer,并在其中利用 BasicSerializer 的常用方法:
- from rest_framework import serializers
- from .models import StatPlatProjectData
- class BasicSerializer(serializers.ModelSerializer):
- pass
- class StatPlatProjectDataSerializer(BasicSerializer):
- created_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
- updated_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
- class Meta:
- model = StatPlatProjectData
- fields = '__all__'
- def to_representation(self, instance):
- data = super().to_representation(instance)
- del_keys = ['created_at', 'updated_at', 'executor']
- for key in del_keys:
- data.pop(key, None)
- return data
复制代码 序列化数据
将 StatPlatProjectData 模型实例序列化为 JSON 格式,并删除指定的字段:
- from .models import StatPlatProjectData
- from .serializers import StatPlatProjectDataSerializer
- # 假设有一个 StatPlatProjectData 实例
- project_data_instance = StatPlatProjectData.objects.get(id=1)
- # 序列化
- serializer = StatPlatProjectDataSerializer(project_data_instance)
- serialized_data = serializer.data
- print(serialized_data)
复制代码 在这个例子中,serialized_data 将包含所有字段,除了 created_at、updated_at 和 executor。
反序列化数据
将 JSON 数据反序列化为 StatPlatProjectData 模型实例:
- from .serializers import StatPlatProjectDataSerializer
- # 假设有一些 JSON 数据
- json_data = {
- 'name': 'New Project',
- 'description': 'This is a new project.',
- 'executor': 'John Doe'
- }
- # 反序列化
- serializer = StatPlatProjectDataSerializer(data=json_data)
- if serializer.is_valid():
- project_data_instance = serializer.save()
- print(project_data_instance)
- else:
- print(serializer.errors)
复制代码 更新实例
利用验证后的数据更新现有的 StatPlatProjectData 实例:
- from .models import StatPlatProjectData
- from .serializers import StatPlatProjectDataSerializer
- # 假设有一个 StatPlatProjectData 实例
- project_data_instance = StatPlatProjectData.objects.get(id=1)
- # 新的数据
- update_data = {
- 'name': 'Updated Project',
- 'description': 'This is an updated project.',
- 'executor': 'Jane Doe'
- }
- # 更新
- serializer = StatPlatProjectDataSerializer(project_data_instance, data=update_data)
- if serializer.is_valid():
- updated_instance = serializer.save()
- print(updated_instance)
- else:
- print(serializer.errors)
复制代码 验证数据
验证输入数据:
- from .serializers import StatPlatProjectDataSerializer
- # 一些无效的 JSON 数据
- invalid_data = {
- 'name': 'Invalid Project',
- 'description': 'This is an invalid project.',
- 'executor': '' # executor 不能为空
- }
- # 验证
- serializer = StatPlatProjectDataSerializer(data=invalid_data)
- if not serializer.is_valid():
- print(serializer.errors) # 输出验证错误信息
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |