您的位置:首页 > 编程语言 > Go语言

Django之信号和序列化

2017-09-21 17:23 399 查看

 

前言

Django的信号要从一张抽象图和一个需求说起;

from django.core.signals import request_finished
from django.core.signals import request_started
from django.core.signals import got_request_exception

from django.db.models.signals import class_prepared
from django.db.models.signals import pre_init, post_init
from django.db.models.signals import pre_save, post_save
from django.db.models.signals import pre_delete, post_delete
from django.db.models.signals import m2m_changed
from django.db.models.signals import pre_migrate, post_migrate

from django.test.signals import setting_changed
from django.test.signals import template_rendered

from django.db.backends.signals import connection_created

def callback(sender,**kwargs):
print(sender)                    #操作的那张表
print(kwargs['instance'].name)  #获取增加的那样记录的 name

pre_save.connect(callback)
View Code  

 

二、自定义信号

如果Django自定制的信息无法满足你的需求还可以自定制信号

1.定义注册

# 自定义信号
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
def callback1(sender,**kwargs):
print('这是一个自定义信号')
print(sender)                    #操作的那张表
print(kwargs)                #获取增加的那样记录的

pizza_done.connect(callback1)

 

2、导入执行

def index(request):
userlist=models.UserInfo.objects.all()
ctime=time.time()
from django缓存 import pizza_done
a=models.UserInfo.objects.create(name='xxx',pwd='123')
pizza_done.send(sender=a.name,pwd=a.pwd) #调用自定义信号必须传sender参数
return render(request,'index.html',locals())

 

 

三、序列化

json模块默认能处理的Python数据类型有限,在使用Django做web开发的时候如何 序列化 query_set和时间数据类型呢?

+---------------+-------------------+
| JSON | Python |
+===============+===================+
| object | dict |
+---------------+-------------------+
| array | list |
+---------------+-------------------+
| string | str |
+---------------+-------------------+
| number (int) | int |
+---------------+-------------------+
| number (real) | float |
+---------------+-------------------+
| true | True |
+---------------+-------------------+
| false | False |
+---------------+-------------------+
| null | None |
+---------------+--------------

如何破解?

1、serializers(Django自带的序列化工具)
from
 
django.core 
import
 
serializers

def index(request): userlist=models.UserInfo.objects.all() # 方案1 userlist_str=serializers.serialize('json',userlist) print(userlist_str) ctime=time.time()[/code]

 

 

2、自定制  json.dumps方法中cls参数(serializers内部也是这样实现的

vale=json.dumps(userlist,cls=json.JSONEncoder)
from datetime import datetime
from datetime import date
import json
#自定义一个类,由于Python的一数据类型,json可以序列化,所有可以继承json.JSONEncoder方法
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):

if isinstance(field, datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field,date ):
return field.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, field)
data_list=[
{'name':'eric0','age':18,'ctime':datetime.now()},
{'name':'eric1','age':18,'ctime':datetime.now()},
{'name':'eric2','age':18,'ctime':datetime.now()}
]

str1=json.dumps(data_list, cls=JsonCustomEncoder)
print(str1)

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: