djnago之序列化器的用法

Django 的序列化器(Serializers)是 Django REST framework(DRF)中的一个核心组件,用于将复杂的数据类型(如 Django 模型实例)转换为 JSON、XML 或其他内容类型,反之亦然。序列化器不仅可以序列化和反序列化数据,还可以进行数据验证和处理。

基本用法

1. 定义模型

定义一些 Django 模型:

python 复制代码
# models.py
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, related_name='books', on_delete=models.CASCADE)
2. 定义序列化器

定义序列化器:

python 复制代码
# serializers.py
from rest_framework import serializers
from .models import Author, Book

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ['id', 'name']

class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer()  # 嵌套序列化器

    class Meta:
        model = Book
        fields = ['id', 'title', 'author']
modelfields 的用法

model 属性指定了这个序列化器对应的 Django 模型。DRF 会根据这个模型自动生成相应的序列化器字段。

fields 属性指定了你希望在序列化器中包含的模型字段。可以选择模型中的所有字段,也可以只选择特定的字段。

fields 的其他用法
包含所有字段

如果你希望序列化器包含模型的所有字段,可以使用特殊的字符串 '__all__'

python 复制代码
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'
排除特定字段

如果你希望序列化器包含模型的所有字段,但排除某些字段,可以使用 exclude 属性:

python 复制代码
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        exclude = ['created_at', 'updated_at']
自定义字段

你还可以在序列化器中添加自定义字段:

python 复制代码
class AuthorSerializer(serializers.ModelSerializer):
    full_name = serializers.SerializerMethodField()

    class Meta:
        model = Author
        fields = ['id', 'name', 'full_name']

    def get_full_name(self, obj):
        return f"{obj.first_name} {obj.last_name}"

fields 属性中字段的顺序决定了序列化的顺序

3. 使用序列化器

在视图中使用序列化器:

python 复制代码
# views.py
from rest_framework import generics
from .models import Author, Book
from .serializers import AuthorSerializer, BookSerializer

class AuthorListCreateView(generics.ListCreateAPIView):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer

class BookListCreateView(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

序列化方法

1. 序列化单个对象
python 复制代码
# 在 Django shell 或视图中
from .models import Book
from .serializers import BookSerializer

book = Book.objects.first()
serializer = BookSerializer(book)
print(serializer.data)
2. 序列化多个对象
python 复制代码
# 在 Django shell 或视图中
books = Book.objects.all()
serializer = BookSerializer(books, many=True)
print(serializer.data)
  • 使用 many=True 可以一次性处理所有对象,而不需要手动循环处理每个对象 。
  • 使用 many=True 可以提高性能,因为 DRF内部会进行优化,减少不必要的开销。手动循环处理每个对象可能会导致性能下降,尤其是在处理大量数据时。

反序列化方法

1. 反序列化单个对象
python 复制代码
# 在 Django shell 或视图中
data = {'title': 'New Book', 'author': {'name': 'New Author'}}
serializer = BookSerializer(data=data)
if serializer.is_valid():
    book = serializer.save()
    print(book)
else:
    print(serializer.errors)
2. 反序列化多个对象
python 复制代码
# 在 Django shell 或视图中
data = [
    {'title': 'Book 1', 'author': {'name': 'Author 1'}},
    {'title': 'Book 2', 'author': {'name': 'Author 2'}}
]
serializer = BookSerializer(data=data, many=True)
if serializer.is_valid():
    books = serializer.save()
    print(books)
else:
    print(serializer.errors)
相关推荐
fantasy_arch1 小时前
pytorch例子计算两张图相似度
人工智能·pytorch·python
WBluuue3 小时前
数学建模:智能优化算法
python·机器学习·数学建模·爬山算法·启发式算法·聚类·模拟退火算法
赴3353 小时前
矿物分类案列 (一)六种方法对数据的填充
人工智能·python·机器学习·分类·数据挖掘·sklearn·矿物分类
大模型真好玩3 小时前
一文深度解析OpenAI近期发布系列大模型:意欲一统大模型江湖?
人工智能·python·mcp
RPA+AI十二工作室3 小时前
亚马逊店铺绩效巡检_影刀RPA源码解读
chrome·python·rpa·影刀
小艳加油4 小时前
Python机器学习与深度学习;Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等
python·深度学习·机器学习·transformer
学行库小秘6 小时前
ANN神经网络回归预测模型
人工智能·python·深度学习·神经网络·算法·机器学习·回归
Yn3126 小时前
在 Python 中使用 json 模块的完整指南
开发语言·python·json
秋难降6 小时前
线段树的深度解析(最长递增子序列类解题步骤)
数据结构·python·算法
猿榜6 小时前
Python基础-控制结构
python