本文共 4414 字,大约阅读时间需要 14 分钟。
class Publisher(models.Model): name = models.CharField(max_length=32, verbose_name='名称', unique=True) address = models.CharField(max_length=128, verbose_name='地址') def __str__(self): return self.name class Meta: verbose_name = '出版社' verbose_name_plural = verbose_name
python manage.py makemigrationspython manage.py migrate
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:
d = dict(name='Zhangsan', age=26, score=75)
可以随时修改变量,比如把name改成'LiSi',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的'LiSi'存储到磁盘上,下次重新运行程序,变量又被初始化为'Zhangsan'。
<b style='color:red'>我们把变量从内存中变成可存储或传输的过程称之为序列化</b>,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,<b style='color:red'>把变量内容从序列化的对象重新读到内存里称之为反序列化</b>,即unpickling。
<b style='color:red'>如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式</b>,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
JSON类型 | Python类型 |
---|---|
{} | dict |
[] | list |
"string" | str |
1234.56 | int或float |
true/false | True/False |
null | None |
Python内置的json模块提供了非常完善的Python对象到JSON格式的转换:
import jsond = dict(name='Zhangsan', age=26, score=75)# dumps()方法返回一个str,内容就是标准的JSONjson_str= json.dumps(d)
json_str = '{"age": 26, "score": 75, "name": "Zhangsan"}'json.loads(json_str)
from .models import Publisherfrom django.http import HttpResponsedef publisher_list(request): # 查询出所有的出版社 queryset = Publisher.objects.all() # 转换成python中的列表 data = [] for i in queryset: # 每一个对象都手动转化成一个字典 p_tmp = { 'name': i.name, 'address': i.address } data.append(p_tmp) import json return HttpResponse(json.dumps(data), content_type='application/json')
url(r'^publishers/', views.publisher_list)
python manage.py runserver
data = []from django.forms.models import model_to_dictfor i in queryset: data.append(model_to_dict(i))
注意:这种方式有缺陷,很多字段无法转换成字典,比如图片
data = []from django.core import serializersdata = serializers.serialize('json', queryset)import jsonreturn HttpResponse(data, content_type='application/json')
注意:此时data已经是json类型
DRF提供的方案更加先进,更高级别的序列化方案,不仅仅可以实现从数据库里面读取数据,更可以存数据(增删改查)
from rest_framework import serializers# 类名固定为表名称 + Serializerclass PublisherSerializer(serializers.Serializer): # read_only必须为True,因为我们模型里面的id是一个自增字段,不可写,自动生成 id = serializers.IntegerField(read_only=True) name = serializers.CharField(max_length=32) address = serializers.CharField(max_length=128)
from app01 import models,serializersp1 = models.Publisher.objects.first()# 先找到一个出版社的对象s = serializers.PublisherSerializer(p1)s.data
def create(self, validated_data): # validated_data参数不需要特意去记,就是经过校验的数据 return models.Publisher.objects.create(**validated_data)def update(self, instance, validated_data): instance.name = validated_data.get('name', instance.name) instance.address = validated_data.get('address', instance.address) instance.save() return instance
from app01 import models,serializersp2 = {'name':'图灵出版社','address':'大兴天宫院'}s = serializers.PublisherSerializer(data=p2)s.is_valid()# 如果数据检测没有问题Out[5]: Trues.validated_data # 可以查看类型,观察到这是一个有序字典Out[6]: OrderedDict([('name', '图灵出版社'), ('address', '大兴天宫院')])s.save() # 保存到数据库Out[7]:
# 第三次改进 from app01 import serializers # 如果是多个对象,一定要写many = True,就是说我们是多个对象, # many=True告诉程序要用遍历的方式去给我们做序列化 s = serializers.PublisherSerializer(queryset, many=True) import json return HttpResponse(json.dumps(s.data), content_type='application/json')
class PublisherSerializer(serializers.ModelSerializer): class Meta: model = models.Publisher # 我们要使用的模型 # 我们要使用的字段 fields = ( 'id', 'name', 'address' )
转载地址:http://iuyba.baihongyu.com/