IT评测·应用市场-qidao123.com技术社区

标题: django之BaseSerializer [打印本页]

作者: 我爱普洱茶    时间: 2024-8-20 03:39
标题: django之BaseSerializer
BaseSerializer 是 Django REST framework (DRF) 中的一个核心类,用于将复杂的数据范例(如查询集和模型实例)转换为 Python 数据范例,以便于渲染成 JSON、XML 或其他内容范例。BaseSerializer 是所有序列化器的基类,提供了一些常用的方法和属性。以下是一些常用的方法和属性的先容:
常用方法

常用属性

下面通过一个详细的示例来展示如安在实际应用中利用 BaseSerializer 中的常用方法。假设有一个简单的 Django 模型 Book,我们将创建一个序列化器 BookSerializer 来演示这些方法的实际用法。
模型定义

首先定义一个简单的 Book 模型:
  1. from django.db import models
  2. class Book(models.Model):
  3.     title = models.CharField(max_length=100)
  4.     author = models.CharField(max_length=100)
  5.     published_date = models.DateField()
  6.     isbn = models.CharField(max_length=13, unique=True)
复制代码
序列化器定义

接下来定义一个 BookSerializer,并在其中利用 BaseSerializer 的常用方法:
  1. from rest_framework import serializers
  2. from .models import Book
  3. class BookSerializer(serializers.Serializer):
  4.     title = serializers.CharField(max_length=100)
  5.     author = serializers.CharField(max_length=100)
  6.     published_date = serializers.DateField()
  7.     isbn = serializers.CharField(max_length=13)
  8.     def to_representation(self, instance):
  9.         """将模型实例转换为原生 Python 数据类型"""
  10.         return {
  11.             'title': instance.title,
  12.             'author': instance.author,
  13.             'published_date': instance.published_date,
  14.             'isbn': instance.isbn,
  15.         }
  16.     def to_internal_value(self, data):
  17.         """将原生数据转换为验证后的数据"""
  18.         return {
  19.             'title': data.get('title'),
  20.             'author': data.get('author'),
  21.             'published_date': data.get('published_date'),
  22.             'isbn': data.get('isbn'),
  23.         }
  24.     def validate(self, attrs):
  25.         """对输入数据进行验证"""
  26.         if len(attrs['isbn']) != 13:
  27.             raise serializers.ValidationError("ISBN must be 13 characters long.")
  28.         return attrs
  29.     def create(self, validated_data):
  30.         """使用验证后的数据创建并返回一个新实例"""
  31.         return Book.objects.create(**validated_data)
  32.     def update(self, instance, validated_data):
  33.         """使用验证后的数据更新并返回一个现有实例"""
  34.         instance.title = validated_data.get('title', instance.title)
  35.         instance.author = validated_data.get('author', instance.author)
  36.         instance.published_date = validated_data.get('published_date', instance.published_date)
  37.         instance.isbn = validated_data.get('isbn', instance.isbn)
  38.         instance.save()
  39.         return instance
复制代码
例子1

序列化数据

将 Book 模型实例序列化为 JSON 格式:
  1. from .models import Book
  2. from .serializers import BookSerializer
  3. # 假设我们有一个 Book 实例
  4. book_instance = Book.objects.get(id=1)
  5. # 序列化
  6. serializer = BookSerializer(book_instance)
  7. serialized_data = serializer.data
  8. print(serialized_data)
复制代码
反序列化数据

将 JSON 数据反序列化为 Book 模型实例:
  1. from .serializers import BookSerializer
  2. # 假设我们有一些 JSON 数据
  3. json_data = {
  4.     'title': 'New Book',
  5.     'author': 'John Doe',
  6.     'published_date': '2023-10-01',
  7.     'isbn': '1234567890123'
  8. }
  9. # 反序列化
  10. serializer = BookSerializer(data=json_data)
  11. if serializer.is_valid():
  12.     book_instance = serializer.save()
  13.     print(book_instance)
  14. else:
  15.     print(serializer.errors)
复制代码
更新实例

利用验证后的数据更新现有的 Book 实例:
  1. from .models import Book
  2. from .serializers import BookSerializer
  3. # 假设我们有一个 Book 实例
  4. book_instance = Book.objects.get(id=1)
  5. # 新的数据
  6. update_data = {
  7.     'title': 'Updated Book',
  8.     'author': 'Jane Doe',
  9.     'published_date': '2023-10-02',
  10.     'isbn': '1234567890123'
  11. }
  12. # 更新
  13. serializer = BookSerializer(book_instance, data=update_data)
  14. if serializer.is_valid():
  15.     updated_instance = serializer.save()
  16.     print(updated_instance)
  17. else:
  18.     print(serializer.errors)
复制代码
验证数据

验证输入数据:
  1. from .serializers import BookSerializer
  2. # 一些无效的 JSON 数据
  3. invalid_data = {
  4.     'title': 'Invalid Book',
  5.     'author': 'John Doe',
  6.     'published_date': '2023-10-01',
  7.     'isbn': '1234567890'  # ISBN 长度不正确
  8. }
  9. # 验证
  10. serializer = BookSerializer(data=invalid_data)
  11. if not serializer.is_valid():
  12.     print(serializer.errors)  # 输出验证错误信息
复制代码
例子2

好的,下面我将完善这个例子,假设有一个名为 StatPlatProjectData 的模型,并且我们盼望在序列化时删除某些字段(如 created_at、updated_at 和 executor),将利用 BasicSerializer 作为基类,并在 to_representation 方法中自定义序列化逻辑。
模型定义

首先定义 StatPlatProjectData 模型:
  1. from django.db import models
  2. class StatPlatProjectData(models.Model):
  3.     name = models.CharField(max_length=100)
  4.     description = models.TextField()
  5.     executor = models.CharField(max_length=100)
  6.     created_at = models.DateTimeField(auto_now_add=True)
  7.     updated_at = models.DateTimeField(auto_now=True)
复制代码
序列化器定义

接下来定义 StatPlatProjectDataSerializer,并在其中利用 BasicSerializer 的常用方法:
  1. from rest_framework import serializers
  2. from .models import StatPlatProjectData
  3. class BasicSerializer(serializers.ModelSerializer):
  4.     pass
  5. class StatPlatProjectDataSerializer(BasicSerializer):
  6.     created_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
  7.     updated_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True)
  8.     class Meta:
  9.         model = StatPlatProjectData
  10.         fields = '__all__'
  11.     def to_representation(self, instance):
  12.         data = super().to_representation(instance)
  13.         del_keys = ['created_at', 'updated_at', 'executor']
  14.         for key in del_keys:
  15.             data.pop(key, None)
  16.         return data
复制代码
序列化数据

将 StatPlatProjectData 模型实例序列化为 JSON 格式,并删除指定的字段:
  1. from .models import StatPlatProjectData
  2. from .serializers import StatPlatProjectDataSerializer
  3. # 假设有一个 StatPlatProjectData 实例
  4. project_data_instance = StatPlatProjectData.objects.get(id=1)
  5. # 序列化
  6. serializer = StatPlatProjectDataSerializer(project_data_instance)
  7. serialized_data = serializer.data
  8. print(serialized_data)
复制代码
在这个例子中,serialized_data 将包含所有字段,除了 created_at、updated_at 和 executor。
反序列化数据

将 JSON 数据反序列化为 StatPlatProjectData 模型实例:
  1. from .serializers import StatPlatProjectDataSerializer
  2. # 假设有一些 JSON 数据
  3. json_data = {
  4.     'name': 'New Project',
  5.     'description': 'This is a new project.',
  6.     'executor': 'John Doe'
  7. }
  8. # 反序列化
  9. serializer = StatPlatProjectDataSerializer(data=json_data)
  10. if serializer.is_valid():
  11.     project_data_instance = serializer.save()
  12.     print(project_data_instance)
  13. else:
  14.     print(serializer.errors)
复制代码
更新实例

利用验证后的数据更新现有的 StatPlatProjectData 实例:
  1. from .models import StatPlatProjectData
  2. from .serializers import StatPlatProjectDataSerializer
  3. # 假设有一个 StatPlatProjectData 实例
  4. project_data_instance = StatPlatProjectData.objects.get(id=1)
  5. # 新的数据
  6. update_data = {
  7.     'name': 'Updated Project',
  8.     'description': 'This is an updated project.',
  9.     'executor': 'Jane Doe'
  10. }
  11. # 更新
  12. serializer = StatPlatProjectDataSerializer(project_data_instance, data=update_data)
  13. if serializer.is_valid():
  14.     updated_instance = serializer.save()
  15.     print(updated_instance)
  16. else:
  17.     print(serializer.errors)
复制代码
验证数据

验证输入数据:
  1. from .serializers import StatPlatProjectDataSerializer
  2. # 一些无效的 JSON 数据
  3. invalid_data = {
  4.     'name': 'Invalid Project',
  5.     'description': 'This is an invalid project.',
  6.     'executor': ''  # executor 不能为空
  7. }
  8. # 验证
  9. serializer = StatPlatProjectDataSerializer(data=invalid_data)
  10. if not serializer.is_valid():
  11.     print(serializer.errors)  # 输出验证错误信息
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4