Django REST framework 数据库序列化集合

1,首先在setting文件之中注册 rest_framework
rest_framework 是一个应用,我们使用这个应用管理来操作数据库

INSTALLED_APPS = [
    ...
    'rest_framework',
]

2,编写视图,使用视图类来管理序列化与反序列化的查询集

from rest_framework.viewsets import ModelViewSet
from .serializers import BookInfoSerializer
from .models import BookInfo

# 继承与模型类操作的一个集合!(定义了get put delete等方法!)
class BookInfoView(viewsets.ModelViewSet):
    # 指定查询集
    queryset = BookInfo.objects.all()
    # 指定一下序列化器!按照指定的序列化器进行序列化操作!
    serializer_class = BookInfoSerializer

3,定义试图路由,在应用app之中定义路由!

router = DefaultRouter()  # 可以处理视图的路由器
router.register(r'books', views.BookInfoViewSet)  # 向路由器中注册视图集

urlpatterns += router.urls  # 将路由器中的所以路由信息追到到django的路由列表中

4,创建序列化管理文件

'''由于每个 app应用规则不一样,因此需要定义序列化也不一样!'''
from rest_framework import serializers

from booktest.models import BookInfo

'''两个自定义序列化'''

'''指定的字段表示,序列化与反序列化的显示字段'''


class BookInfoSerializer(serializers.Serializer):
    """图书数据序列化器,设置字段(先转化字段指定的类型,如果能转换,那么通过,不能就不能通过!)"""
    id = serializers.IntegerField(label='ID', read_only=True)
    btitle = serializers.CharField(label='名称', max_length=20)
    bpub_date = serializers.DateField(label='发布日期', required=False)
    bread = serializers.IntegerField(label='阅读量', required=False)
    # bcomment = serializers.IntegerField(label='评论量', required=False)
    # image = serializers.ImageField(label='图片', required=False)

    def create(self, validated_data):
        """新建"""
        return BookInfo(**validated_data)

    def update(self, instance, validated_data):
        """更新,instance为要更新的对象实例"""
        instance.btitle = validated_data.get('btitle', instance.btitle)
        instance.bpub_date = validated_data.get('bpub_date', instance.bpub_date)
        instance.bread = validated_data.get('bread', instance.bread)
        #instance.bcomment = validated_data.get('bcomment', instance.bcomment)
        return instance

class HeroInfoSerializer(serializers.Serializer):
    """英雄数据序列化器"""
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    id = serializers.IntegerField(label='ID', read_only=True)
    hname = serializers.CharField(label='名字', max_length=20)
    # 需要指定 GENDER_CHOICES 类型!
    hgender = serializers.ChoiceField(choices=GENDER_CHOICES, label='性别', required=False)
    hcomment = serializers.CharField(label='描述信息', max_length=200, required=False, allow_null=True)
    # 只显示外键id
    # hbook = serializers.PrimaryKeyRelatedField(read_only=True)
    # 显示外键的 __str__ 方法
    # hbook = serializers.StringRelatedField(read_only=True)
    # 显示外键对应图书的所有信息!
    hbook = BookInfoSerializer()


'''在shell 之中使用序列化管理器,如果返回多条数据,那么就指定many=True属性!
    序列化是查询数据,反序列化是更改数据!
    每一个表都可以建一个serializer,类似Django的Form  专门用于json的处理
    首先定义字段,告诉REST框架,哪些字段(field),需要被序列化/反序列化

    如果创建序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,如果传递了instance实例,则调用save()方法的时候,update()被调用。
'''
View Code

 

 

 

posted @ 2018-06-15 10:36  十七楼的羊  阅读(125)  评论(0编辑  收藏  举报