当前位置:   article > 正文

django之BaseSerializer

django之BaseSerializer

BaseSerializer 是 Django REST framework (DRF) 中的一个核心类,用于将复杂的数据类型(如查询集和模型实例)转换为 Python 数据类型,以便于渲染成 JSON、XML 或其他内容类型。BaseSerializer 是所有序列化器的基类,提供了一些常用的方法和属性。以下是一些常用的方法和属性的介绍:

常用方法

  1. to_representation(instance)

    • 描述: 将模型实例或查询集转换为原生 Python 数据类型。
    • 用途: 用于序列化数据,即将复杂数据类型转换为简单的、可序列化的数据类型。
    • 示例:
      def to_representation(self, instance):
          return {
              'id': instance.id,
              'name': instance.name,
              'email': instance.email,
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
  2. to_internal_value(data)

    • 描述: 将原生数据(通常是字典)转换为验证后的数据。
    • 用途: 用于反序列化数据,即将简单的、可序列化的数据类型转换为复杂的数据类型。
    • 示例:
      def to_internal_value(self, data):
          return {
              'id': data.get('id'),
              'name': data.get('name'),
              'email': data.get('email'),
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
  3. 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
      
      • 1
      • 2
      • 3
      • 4
  4. create(validated_data)

    • 描述: 使用验证后的数据创建并返回一个新实例。
    • 用途: 用于处理创建操作。
    • 示例:
      def create(self, validated_data):
          return MyModel.objects.create(**validated_data)
      
      • 1
      • 2
  5. 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
      
      • 1
      • 2
      • 3
      • 4
      • 5

常用属性

  1. data

    • 描述: 返回序列化后的数据。
    • 用途: 用于获取序列化后的数据。
    • 示例:
      serializer = MySerializer(instance)
      serialized_data = serializer.data
      
      • 1
      • 2
  2. errors

    • 描述: 返回验证错误信息。
    • 用途: 用于获取验证错误信息。
    • 示例:
      serializer = MySerializer(data=request.data)
      if not serializer.is_valid():
          errors = serializer.errors
      
      • 1
      • 2
      • 3
  3. is_valid(raise_exception=False)

    • 描述: 检查数据是否有效。
    • 用途: 用于验证数据。
    • 示例:
      serializer = MySerializer(data=request.data)
      if serializer.is_valid():
          # Data is valid
      else:
          # Data is not valid
      
      • 1
      • 2
      • 3
      • 4
      • 5
  4. validated_data

    • 描述: 返回验证后的数据。
    • 用途: 用于获取验证后的数据。
    • 示例:
      serializer = MySerializer(data=request.data)
      if serializer.is_valid():
          validated_data = serializer.validated_data
      
      • 1
      • 2
      • 3
  5. initial_data

    • 描述: 返回初始化时传入的原始数据。
    • 用途: 用于获取初始化时传入的原始数据。
    • 示例:
      serializer = MySerializer(data=request.data)
      initial_data = serializer.initial_data
      
      • 1
      • 2

下面通过一个具体的示例来展示如何在实际应用中使用 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

序列化器定义

接下来定义一个 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

例子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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
反序列化数据

将 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
更新实例

使用验证后的数据更新现有的 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
验证数据

验证输入数据:

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)  # 输出验证错误信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

例子2

好的,下面我将完善这个例子,假设有一个名为 StatPlatProjectData 的模型,并且我们希望在序列化时删除某些字段(如 created_atupdated_atexecutor),将使用 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
序列化器定义

接下来定义 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
序列化数据

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这个例子中,serialized_data 将包含所有字段,除了 created_atupdated_atexecutor

反序列化数据

将 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
更新实例

使用验证后的数据更新现有的 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
验证数据

验证输入数据:

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)  # 输出验证错误信息
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/1005981
推荐阅读
相关标签
  

闽ICP备14008679号