1. 序列化准备(命令行)

准备工作

安装

pip install djangorestframework

加载

'rest_framework',

添加App 总目录

import os
import sys

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# 添加下面这行代码后,后面添加子目录可以直接加,添加apps到全局路径。sys.path是django当中可搜索的所有模块目录。0表示最开始位置


sys.path.insert(0,os.path.join(BASE_DIR,"apps"))

子目录

cd Apps/

python manage.py  startapp idcs

注意apps.py

class IdcsConfig(AppConfig):
    name = 'idcs'  //前面不能有apps

路由

from django.conf.urls import url,include
urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'idcs/',include("idcs.urls")), 

]

idcs路由

urlpatterns = [

]

模型

from django.db import models

# Create your models here.

class Idc(models.Model):
    name = models.CharField("机房名称",max_length=32)
    address = models.CharField("机房地址",max_length=256)
    phone = models.CharField("联系人",max_length=15)
    email = models.EmailField("邮件地址",default="null")
    letter = models.CharField("IDC简称",max_length=5)
    def __str__(self):
        return self.name
    class Meta:
        db_table= 'resources_idc'
python manage.py  makemigrations idcs
python manage.py  migrate idcs

原生序列化模型

在这里插入图片描述

  1. mysql
  2. queryset=Idc.objects.all()
  3. json.dumps() => 序列化
  4. HttpRespons()

创建数据

>>> from idcs.models import Idc
>>> idc = Idc()
>>> idc.name= "亦庄机房"
>>> idc.address="北京亦庄机房"
>>> idc.phone="123456"
>>> idc.email="xx@mail.com"
>>> idc.letter='yz'
>>> idc.save()
>>> idc
<Idc: 亦庄机房>
>>> idc.id= None
>>> idc.name= "广州机房"
>>> idc.address="广州机房"
>>> idc.letter='gz'
>>> idc.save()
>>> idc
<Idc: 广州机房>
>>> Idc
<class 'idcs.models.Idc'>
>>> Idc.objects.all()
<QuerySet [<Idc: 亦庄机房>, <Idc: 广州机房>]>
>>> idc = Idc.objects.get(pk=1)
>>> idc
<Idc: 亦庄机房>

序列化

# 序列化,因为是序列化模型,所以跟模型同一个目录
from rest_framework import serializers
from .models import Idc
class IdcSerializer(serializers.Serializer):
    id = serializers.IntegerField( )
    name = serializers.CharField( )
    address = serializers.CharField( )
    phone = serializers.CharField( )
    email = serializers.EmailField( )
    letter = serializers.CharField( )
>>> from idcs.serializers import IdcSerializer
>>>> serializer = IdcSerializer(idc)
>>> serializer.data
{'id': 1, 'name': '亦庄机房', 'address': '北京亦庄机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'yz'}

>>> a = serializer.data
>>> type(a)
<class 'rest_framework.utils.serializer_helpers.ReturnDict'>
>>> import json
>>> json.dumps(a)
'{"id": 1, "name": "\\u4ea6\\u5e84\\u673a\\u623f", "address": "\\u5317\\u4eac\\u4ea6\\u5e84\\u673a\\u623f", "phone": "123456", "email": "xx@mail.com", "letter": "yz"}'
>>> from rest_framework.renderers import JSONRenderer
>>>> jr =  JSONRenderer()
>>> jr.render
jr.render(       jr.render_style  
>>> jr.render(a)
b'{"id":1,"name":"\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","address":"\xe5\x8c\x97\xe4\xba\xac\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","phone":"123456","email":"xx@mail.com","letter":"yz"}'
>>> content =  jr.render(serializer.data)

序列化验证

# 序列化,因为是序列化模型,所以跟模型同一个目录
from rest_framework import serializers
from .models import Idc
class IdcSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(required=True,max_length=32,label="机房名称",help_text="机房名称",error_messages={"blank":"机房名称不能为空","required":"这个字段必须输入"}) 
    address = serializers.CharField(required=True,max_length=256,label="机房地址",help_text="机房地址",
error_messages={"blank":"这个字段不能为空","required":"这个字段必须输入"})
    phone = serializers.CharField(required=True,max_length=15,label="联系电话",help_text="联系电话")
    email = serializers.EmailField(required=True,label="邮箱",help_text="邮箱")
    letter = serializers.CharField(required=True,max_length=5,label="简称",help_text="简称")

反序列化(插入数据库)

在这里插入图片描述

安装依赖包

pip install six
[root@sdns idcs]# cp /usr/lib/python2.7/site-packages/six.py /usr/local/lib64/python3.6/site-packages/django/utils/

创建前端模拟的数据

>>> from django.utils.six import BytesIO
>>> stream = BytesIO(content)
>>> print(stream)
<_io.BytesIO object at 0x7fa42e5ab258>
>>> dir(stream)
['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', 'close', 'closed', 'detach', 'fileno', 'flush', 'getbuffer', 'getvalue', 'isatty', 'read', 'read1', 'readable', 'readinto', 'readinto1', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']
>>> stream.read()
b'{"id":1,"name":"\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","address":"\xe5\x8c\x97\xe4\xba\xac\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","phone":"123456","email":"xx@mail.com","letter":"yz"}'
>>> from rest_framework.parsers import JSONParser
>>> jsondata = JSONParser()
>>> jsondata.parse(stream)
报错... 因为是这个sream是流对象,read过就清空了
rest_framework.exceptions.ParseError: JSON parse error - Expecting value: line 1 column 1 (char 0)

>>> stream.read()
b''
>>> content
b'{"id":1,"name":"\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","address":"\xe5\x8c\x97\xe4\xba\xac\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","phone":"123456","email":"xx@mail.com","letter":"yz"}'
>>> stream = BytesIO(content)
>>> data = jsondata.parse(stream)
// 模拟这是前端数据
>>> data
{'id': 1, 'name': '亦庄机房', 'address': '北京亦庄机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'yz'}
// 拿到标准json后,就可以反序列化
>>> type(data)
<class 'dict'>

验证拿到数据是否干净

>>> serializer = IdcSerializer(data=data)
>>> serializer
IdcSerializer(data={'id': 1, 'name': '亦庄机房', 'address': '北京亦庄机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'yz'}):
    id = IntegerField(read_only=True)
    name = CharField(error_messages={'blank': '机房名称不能为空', 'required': '这个字段必须输入'}, help_text='机房名称', label='机房名称', max_length=32, required=True)
    address = CharField(error_messages={'blank': '这个字段不能为空', 'required': '这个字段必须输入'}, help_text='机房地址', label='机房地址', max_length=256, required=True)
    phone = CharField(help_text='联系电话', label='联系电话', max_length=15, required=True)
    email = EmailField(help_text='邮箱', label='邮箱', required=True)
    letter = CharField(help_text='简称', label='简称', max_length=5, required=True)
// 返回验证是true   
>>> serializer.is_valid()
True
// 查看可以反序列化的数据,拿到干净数据
>>> serializer.validated_data
OrderedDict([('name', '亦庄机房'), ('address', '北京亦庄机房'), ('phone', '123456'), ('email', 'xx@mail.com'), ('letter', 'yz')])

插入到数据库(create/update)

serializers.py 添加创建和更新的方法(用于保存反序列化,将json以何种方式存储数据库)

# 序列化,因为是序列化模型,所以跟模型同一个目录
from rest_framework import serializers
from .models import Idc
class IdcSerializer(serializers.Serializer):
    '''
    Idc序列化类,注释可以自动生成接口文档
    1. 模型 2. 序列化 3. 视图
    ''' 
    
    
    # 1. 定义类型
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(required=True,max_length=32,label="机房名称",help_text="机房名称",error_messages={"blank":"机房名称不能为空","required":"这个字段必须输入"}) 
    address = serializers.CharField(required=True,max_length=256,label="机房地址",help_text="机房地址",
error_messages={"blank":"这个字段不能为空","required":"这个字段必须输入"})
    phone = serializers.CharField(required=True,max_length=15,label="联系电话",help_text="联系电话")
    email = serializers.EmailField(required=True,label="邮箱",help_text="邮箱")
    letter = serializers.CharField(required=True,max_length=5,label="简称",help_text="简称")
    
    // django能够自动判断是create还是update,通过id是否存在来判断
    def create(self,validated_data):
        return Idc.objects.create(**validated_data)
    // update里面定义了哪些字段可以更改    
    def update(self,instance,validated_data):
        instance.name=validated_data.get("name",instance.name)
        instance.address=validated_data.get("address",instance.address)
        instance.phone=validated_data.get("phone",instance.phone)
        instance.email=validated_data.get("email",instance.email)
        instance.save()
        return instance  
>>> serializer.save()
<Idc: 亦庄机房>
>>> 

注意需要重写save 方法,否则会报错
在这里插入图片描述

多条数据

[root@sdns DjangoProject]# python manage.py shell
Python 3.6.8 (default, Nov 16 2020, 16:55:22) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from rest_framework import serializers
>>> from idcs.serializers import IdcSerializer
>>> from django.utils.six import BytesIO
>>> from idcs.models import Idc
>>> Idc.objects.all()
<QuerySet [<Idc: 亦庄机房>, <Idc: 广州机房>, <Idc: 亦庄机房>]>

>>> data = IdcSerializer(Idc.objects.all(),many=True)
>>> data
IdcSerializer(<QuerySet [<Idc: 亦庄机房>, <Idc: 广州机房>, <Idc: 亦庄机房>]>, many=True):
    id = IntegerField(read_only=True)
    name = CharField(error_messages={'blank': '机房名称不能为空', 'required': '这个字段必须输入'}, help_text='机房名称', label='机房名称', max_length=32, required=True)
    address = CharField(error_messages={'blank': '这个字段不能为空', 'required': '这个字段必须输入'}, help_text='机房地址', label='机房地址', max_length=256, required=True)
    phone = CharField(help_text='联系电话', label='联系电话', max_length=15, required=True)
    email = EmailField(help_text='邮箱', label='邮箱', required=True)
    letter = CharField(help_text='简称', label='简称', max_length=5, required=True)
>>> serialize = IdcSerializer(Idc.objects.all(),many=True)
>>> from rest_framework.renderers import JSONRenderer
>>> content = JSONRenderer().render(serialize.data)
>>> content
b'[{"id":1,"name":"\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","address":"\xe5\x8c\x97\xe4\xba\xac\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","phone":"123456","email":"xx@mail.com","letter":"yz"},{"id":2,"name":"\xe5\xb9\xbf\xe5\xb7\x9e\xe6\x9c\xba\xe6\x88\xbf","address":"\xe5\xb9\xbf\xe5\xb7\x9e\xe6\x9c\xba\xe6\x88\xbf","phone":"123456","email":"xx@mail.com","letter":"gz"},{"id":3,"name":"\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","address":"\xe5\x8c\x97\xe4\xba\xac\xe4\xba\xa6\xe5\xba\x84\xe6\x9c\xba\xe6\x88\xbf","phone":"123456","email":"xx@mail.com","letter":"yz"}]'
>>> stream = BytesIO(content)
>>> from rest_framework.parsers import JSONParser
>>> jsondata = JSONParser()
>>> data = jsondata.parse(stream)
>>> data
[{'id': 1, 'name': '亦庄机房', 'address': '北京亦庄机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'yz'}, {'id': 2, 'name': '广州机房', 'address': '广州机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'gz'}, {'id': 3, 'name': '亦庄机房', 'address': '北京亦庄机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'yz'}]
>>> serializer = IdcSerializer(data=data)
>>> serializer
IdcSerializer(data=[{'id': 1, 'name': '亦庄机房', 'address': '北京亦庄机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'yz'}, {'id': 2, 'name': '广州机房', 'address': '广州机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'gz'}, {'id': 3, 'name': '亦庄机房', 'address': '北京亦庄机房', 'phone': '123456', 'email': 'xx@mail.com', 'letter': 'yz'}]):
    id = IntegerField(read_only=True)
    name = CharField(error_messages={'blank': '机房名称不能为空', 'required': '这个字段必须输入'}, help_text='机房名称', label='机房名称', max_length=32, required=True)
    address = CharField(error_messages={'blank': '这个字段不能为空', 'required': '这个字段必须输入'}, help_text='机房地址', label='机房地址', max_length=256, required=True)
    phone = CharField(help_text='联系电话', label='联系电话', max_length=15, required=True)
    email = EmailField(help_text='邮箱', label='邮箱', required=True)
    letter = CharField(help_text='简称', label='简称', max_length=5, required=True)
>>> serializer.is_valid()
False
>>> serializer.validated_data
{}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值