飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一:模型类序列化器的定义和基本使用:

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: 山纹列传>
posted on 2020-09-20 20:45  飞行的猪哼哼  阅读(30)  评论(0)    收藏  举报