RestFramework:二、序列化组件-创新互联
一、序列化组件

环境配置:
使django支持Mysql(前面已有介绍,这里不再重复)
使django支持 framework
在settings.py中的INSTALLED_APPS字段添加:
"rest_framework"
序列化组件的使用
-Serializer
-1 重命名:用source:xx = serializers.CharField(source='name')
-2 取出出版社名字:
方式一:
-在模型表中重写__str__方法
-publish=serializers.CharField()
方式二:
-用source
-拿出出版社的城市
-publish=serializers.CharField(source='publish.city')
*****如果不指定source,字段必须对应起来,如果指定了source,字段可以任意命名
-source 可以指定字段,也可也指定方法
publish.test这是个方法,会执行该方法,并拿到返回结果
test = serializers.CharField(source='publish.test')
-3 SerializerMethodField,可以指定一个方法
publish=serializers.SerializerMethodField()
# 方法名:叫get_字段名,要传参数,参数是:当前book对象
def get_publish(self,obj):
# obj 是当前book对象
dic={'name':obj.publish.name,'email':obj.publish.email}
return dic
-方法内部可以继续用其他的序列化类
-ModelSerializer
-必须在类中写
class Meta:
model=指定表
# fields = '__all__'
# 指定只取这两个字段
fields = ['nid','name']
# 去掉指定的字段
# exclude=['publish','authors']
# fields,跟exclude不能连用
# 指定深度,就是跨几个表(官方建议小于10,我给你的建议小于3)
# depth = 2urls.py
url(r'^books/', views.Books.as_view()),
views.py
from django.shortcuts import render from app01 import models # Create your views here. from rest_framework.views import APIView from app01.server import BookSerializer from django.http import JsonResponse class Books(APIView): def get(self,request,*args,**kwargs): # ret=models.Book.objects.all() # 生成一个序列化的对象,传参数 # 序列化多条,记住many=True book_ser=BookSerializer(ret,many=True) print(book_ser.data) # safe=False 可以序列化列表 return JsonResponse(book_ser.data, safe=False
models.py
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) publish_date = models.DateField() # 外键对应数据库表中的字段名后面会自动加"_id" # on_delete=models.CASCADE 级联删除 publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE) # ManyToManyField 自动创建第三张表,本表名_到你对应多的表名名字,自动帮你把表名转小写 authors = models.ManyToManyField(to='Author') def __str__(self): return self.name class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to='AuthorDatail', to_field='nid', unique=True, on_delete=models.CASCADE) class AuthorDatail(models.Model): nid = models.AutoField(primary_key=True) telephone = models.BigIntegerField() birthday = models.DateField() addr = models.CharField(max_length=64) class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name def test(self): return self.email
最后使用:
python3 manage makemigrations
python3 manage migrate
app01/server.py
from rest_framework import serializers
# class AuthorSerializer(serializers.Serializer):
# nid = serializers.CharField()
# name = serializers.CharField()
# age = serializers.CharField()
# class BookSerializer(serializers.Serializer):
# # 可以用source修改别名
# # - source 可以指定字段,也可也指定方法
# abc = serializers.CharField(source='name') # 对应models.py中 Book 类中的 name 字段,这里的名字必须要和 Book 类中的 name 字段相互匹配
# price = serializers.CharField()
# # - source 可以指定字段,也可也指定方法
# publish_alias = serializers.CharField(source='publish.city')
# publish_id = serializers.CharField()
# # 可以指定并运行方法中的函数,并拿到返回结果
# test_auth = serializers.CharField(source='publish.test')
# # SerializerMethodField,可以指定一个方法
# publish = serializers.SerializerMethodField()
#
# # 函数名必须是get_字段名,要传参数,参数是:当前book对象
# def get_publish(self, obj):
# dic = {'name': obj.publish.name, 'email': obj.publish.email}
# return dic
#
# authors = serializers.SerializerMethodField()
#
# # 方式一:(了解)
# # def get_authors(self, book):
# # # 拿到这本书的所有作者
# # aus = book.authors.all()
# # # 拼出一个列表, 列表中套字典, 每个字典是一个作者
# # li = []
# # for i in aus:
# # li.append({'name': i.name, 'age': i.age})
# # return li
# # -----------分割线------不用for循环 也可以拿到作者信息--------------------
# # 方式二:(推荐)
# # 方法内部可以继续用其他的序列化类
# def get_authors(self, book):
# aus = book.authors.all()
# # 可以继续用序列化类,来处理
# auth_ser = AuthorSerializer(aus, many=True)
# return auth_ser.data
# 方式三:(主推荐)# 需要把以上代码全部都注释掉方可使用下面的方式。
# class AuthorSerializer(serializers.Serializer):
# nid = serializers.CharField()
# name = serializers.CharField()
# age = serializers.CharField()
#
#
# from app01.models import Book
#
#
# class BookSerializer(serializers.ModelSerializer):
# # 必须写一个内部类,名字必须叫Meta
# class Meta:
# # 这样就可以拿到Book 表中的所有信息了
# model = Book
# fields = '__all__'
# # 重写属性,可以显示出publish的具体内容,不写的话,只是会显示publish的ID
#
# publish = serializers.CharField(source='publish.name')
# authors = serializers.SerializerMethodField()
#
# def get_authors(self, book):
# aus = book.authors.all()
# auth_ser = AuthorSerializer(aus, many=True)
# return auth_ser.data
# 方式四:需要把以上代码全部都注释掉方可使用下面的方式。
from app01.models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
# 这样就可以拿到Book 表中的所有信息了
model = Book
# fields = '__all__'
# 指定深度,就是跨几个表(官方建议小于10,我给你的建议小于3),可控性差,效率低(因为要来回查数据库)
# depth = 2
# -------------分割线----------fields = '__all__';depth = 2 去注释
# 去掉指定的字段
# exclude=['publish','authors']
# ----------分割线在Meta类中,除了model = Book 不注释,其他都需要注释掉方可显示出效果
# 指定只取这两个字段
# 注意:exclude与fields不能联用
fields = ['nid', 'name']最后只使用postman 的get 方式来验证即可。不用修改里面配置

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章名称:RestFramework:二、序列化组件-创新互联
标题来源:http://www.jxjierui.cn/article/dsphdh.html


咨询
建站咨询
