djnago之序列化器的用法

打印 上一主题 下一主题

主题 511|帖子 511|积分 1533

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

1. 定义模型

定义一些 Django 模型:
  1. # models.py
  2. from django.db import models
  3. class Author(models.Model):
  4.     name = models.CharField(max_length=100)
  5. class Book(models.Model):
  6.     title = models.CharField(max_length=100)
  7.     author = models.ForeignKey(Author, related_name='books', on_delete=models.CASCADE)
复制代码
2. 定义序列化器

定义序列化器:
  1. # serializers.py
  2. from rest_framework import serializers
  3. from .models import Author, Book
  4. class AuthorSerializer(serializers.ModelSerializer):
  5.     class Meta:
  6.         model = Author
  7.         fields = ['id', 'name']
  8. class BookSerializer(serializers.ModelSerializer):
  9.     author = AuthorSerializer()  # 嵌套序列化器
  10.     class Meta:
  11.         model = Book
  12.         fields = ['id', 'title', 'author']
复制代码
model 和 fields 的用法

model 属性指定了这个序列化器对应的 Django 模型。DRF 会根据这个模型主动天生相应的序列化器字段。
fields 属性指定了你盼望在序列化器中包罗的模型字段。可以选择模型中的全部字段,也可以只选择特定的字段。
fields 的其他用法

包罗全部字段

如果你盼望序列化器包罗模型的全部字段,可以利用特别的字符串 '__all__':
  1. class AuthorSerializer(serializers.ModelSerializer):
  2.     class Meta:
  3.         model = Author
  4.         fields = '__all__'
复制代码
排除特定字段

如果你盼望序列化器包罗模型的全部字段,但排除某些字段,可以利用 exclude 属性:
  1. class AuthorSerializer(serializers.ModelSerializer):
  2.     class Meta:
  3.         model = Author
  4.         exclude = ['created_at', 'updated_at']
复制代码
自定义字段

你还可以在序列化器中添加自定义字段:
  1. class AuthorSerializer(serializers.ModelSerializer):
  2.     full_name = serializers.SerializerMethodField()
  3.     class Meta:
  4.         model = Author
  5.         fields = ['id', 'name', 'full_name']
  6.     def get_full_name(self, obj):
  7.         return f"{obj.first_name} {obj.last_name}"
复制代码
fields 属性中字段的顺序决定了序列化的顺序
3. 利用序列化器

在视图中利用序列化器:
  1. # views.py
  2. from rest_framework import generics
  3. from .models import Author, Book
  4. from .serializers import AuthorSerializer, BookSerializer
  5. class AuthorListCreateView(generics.ListCreateAPIView):
  6.     queryset = Author.objects.all()
  7.     serializer_class = AuthorSerializer
  8. class BookListCreateView(generics.ListCreateAPIView):
  9.     queryset = Book.objects.all()
  10.     serializer_class = BookSerializer
复制代码
序列化方法

1. 序列化单个对象

  1. # 在 Django shell 或视图中
  2. from .models import Book
  3. from .serializers import BookSerializer
  4. book = Book.objects.first()
  5. serializer = BookSerializer(book)
  6. print(serializer.data)
复制代码
2. 序列化多个对象

  1. # 在 Django shell 或视图中
  2. books = Book.objects.all()
  3. serializer = BookSerializer(books, many=True)
  4. print(serializer.data)
复制代码


  • 利用 many=True 可以一次性处理全部对象,而不需要手动循环处理每个对象 。
  • 利用 many=True 可以提高性能,因为 DRF内部会举行优化,减少不必要的开销。手动循环处理每个对象大概会导致性能降落,尤其是在处理大量数据时。
反序列化方法

1. 反序列化单个对象

  1. # 在 Django shell 或视图中
  2. data = {'title': 'New Book', 'author': {'name': 'New Author'}}
  3. serializer = BookSerializer(data=data)
  4. if serializer.is_valid():
  5.     book = serializer.save()
  6.     print(book)
  7. else:
  8.     print(serializer.errors)
复制代码
2. 反序列化多个对象

  1. # 在 Django shell 或视图中
  2. data = [
  3.     {'title': 'Book 1', 'author': {'name': 'Author 1'}},
  4.     {'title': 'Book 2', 'author': {'name': 'Author 2'}}
  5. ]
  6. serializer = BookSerializer(data=data, many=True)
  7. if serializer.is_valid():
  8.     books = serializer.save()
  9.     print(books)
  10. else:
  11.     print(serializer.errors)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表