一:模型类序列化器的定义和基本使用:
1:demo测试:
from rest_framework import serializers
# serializers.ModelSerializer : 模型类序列化器基类
from models import BookInfo
class BooInfoModelSerialisers(serializers.ModelSerializer):
class Meta:
# 1: 声明当前序列化器针对的模型类
model = BookInfo
# 2: 声明参与序列化/反序列化的模型类字段
fields = "__all__" # 所有字段
2:测试运行:
>>> from books.serializers import *
>>> from books.models import *
>>> book = BookInfo.objects.get(pk=1)
>>> book
<BookInfo: 射雕英雄传>
>>> bs = BooInfoModelSerialisers(instance=book)
>>> bs.data
{'image': None, 'bread': 12, 'btitle': '射雕英雄传', 'bcomment': 34, 'is_delete': False, 'bpub_date': '1980-05-01', 'id': 1}
3:注意的事情:
3.1:all 的范围:除了主键字段会映射,其余隐藏字段:如外键字段,不会主动映射。
3.2: 查看序列化哪些内容:直接调用一下序列化器对象:
>>> BooInfoModelSerialisers()
BooInfoModelSerialisers():
id = IntegerField(label='ID', read_only=True)
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
image = ImageField(allow_null=True, label='图片', max_length=100, required=False)
3.3:显示的声明哪些字段需要被序列化/反序列化:fields = []
class BooInfoModelSerialisers(serializers.ModelSerializer):
class Meta:
# 1: 声明当前序列化器针对的模型类
model = BookInfo
# 2: 声明参与序列化/反序列化的模型类字段
# fields = "__all__" # 所有字段
fields = ['btitle', 'bread']
BooInfoModelSerialisers():
btitle = CharField(label='名称', max_length=20)
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
3.4:除了。。。以外的字段都拿过来。。:exclude = []
exclude = ['btitle', 'bread']
>>> from books.serializers import *
>>> BooInfoModelSerialisers()
BooInfoModelSerialisers():
id = IntegerField(label='ID', read_only=True)
bpub_date = DateField(label='发布日期')
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
image = ImageField(allow_null=True, label='图片', max_length=100, required=False)
3.5: 修改映射过来的约束条件:extra_kwargs = {"bread": {"min_value" : 0}}
class BooInfoModelSerialisers(serializers.ModelSerializer):
class Meta:
# 1: 声明当前序列化器针对的模型类
model = BookInfo
# 2: 声明参与序列化/反序列化的模型类字段
fields = "__all__" # 所有字段
extra_kwargs = {"bcomment": {"min_value": 0}}
>>> from books.serializers import *
>>> BooInfoModelSerialisers()
BooInfoModelSerialisers():
id = IntegerField(label='ID', read_only=True)
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=0, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
image = ImageField(allow_null=True, label='图片', max_length=100, required=False)
3.6:设置read_only 的方法: read_only_fields = []
id 只参与序列化,不参与反序列化。
class BooInfoModelSerialisers(serializers.ModelSerializer):
class Meta:
# 1: 声明当前序列化器针对的模型类
model = BookInfo
# 2: 声明参与序列化/反序列化的模型类字段
fields = "__all__" # 所有字段
extra_kwargs = {"bcomment": {"min_value": 0}}
read_only_fields = ['id']
二:利用模型类序列化器进行新建和修改
1: 测试新建:
>>> from books.serializers import *
>>> from books.models import *
>>> book_info = {"btitle": "胡子猎战", "bpub_date": "1999-10-1"}
>>> bs = BooInfoModelSerialisers(data = book_info)
>>> bs.is_valid()
True
>>> bs.save()
<BookInfo: 胡子猎战>
2:测试修改:
>>> book = BookInfo.objects.get(pk =6)
>>> book_info = {"btitle": "山纹列传"}
>>> bs = BooInfoModelSerialisers(instance= book, data= book_info, partial=True)
>>> bs.is_valid()
True
>>> bs.save()
<BookInfo: 山纹列传>
浙公网安备 33010602011771号