on the day
聚合查询
from django.db.models import Max,Min,Sum,Count,Avg
需要关键字才能触发,aggregate
分组查询
关键字,annotate
models.点什么,就是按什么分组
F与Q查询
from django.db.models import F,Q
F 能够帮助你获取表中字段所对应的数据
eg:models.Book.objects.filter(kucun_gt=F('maichu'))
Q 与或非
eg:models.Book.objects.filter(Q(title='python'),Q(price=666))
eg:models.Book.objects.filter(Q(title='python')|Q(price=666))
eg:models.Book.objects.filter(~Q(title='python')|Q(price=666))
Q进阶
q = Q()
q.connector = 'or'
q.children.append(('title','python'))
q.children.append(('title_icontains','python'))
q.children.append(('price',666))
models.Book.objects.filter(q)
默认是and关系
django开启事务操作
from django.db import transaction
try:
with transaction.atomic():
except BaseException as e:
print(e)
加入try用来防止报错,with语句下面缩进的属于同一事物,退出缩进则表示退出事物
推荐人工智能方向网站
百度AI,图灵机器人,科大讯飞
常见字段参数
AutoField()设置主键
DateField()
DateTimeField(auto_now/auto_add_now)
TextField()
EmailField()数据库对顶varcahr(256)
BooleanField()传布尔值,0,1
is开头的字段名一般为布尔值
自定义char字段
class MyCharDield(models.Field):
def db_type(self,connection):
return 'char(%s)'%self.max_length
orm查询优化
only
defer
获取的是对象,
select_related
peretch_related
连表,不用走数据库
图书管理系统
书籍增删改查
Today
choice参数
get_gender_display()
针对choice字段,获取对应中文,不能直接点字段
固定句式 数据对象.get_字段名__display()
当没有对应关系的时候,该句式获取的还是数字
当我们存的某一字段名时,如果它的值是有限的,我们就可以用choice参数
eg:性别
choices(名字自定义) = ((1,'male'),(2,'female'),(3,'others'))
gender = models.IntegerField(choices=choices)
这个时候存性别值存的是数字 ,就算没有对应关系也是可以存的,
取值,choice字段,对象取值只能取到数字,它有独特的取值方式
比如性别存在用户表中
user_obj.gender
指挥获得1.2.3.
user_obj.get_gender_display()
获取male等
choice字段取值固定句式;get_字段名_display()
可以设置默认值,设置为存的数值
eg:gender = models.IntegerField(choices=choices,default=1)
MTV与MVC模型
django号称是MTV框架,其实还是MVC框架
MTV:M:models T:templates V;views
MVC:,M;models V;views C;contronner(路由匹配)
ajax
一门js技术,基于原生js开发的,但是原生的js代码过于繁琐,只学习jQuery实现ajax
ajax最大的优点就是在不重新加载整个页面的情况下,可以与服务器交换数据更新部分网页内容(用户感受就是不知不觉间完成响应与请求过程)
特点:
异步提交
同步异步任务的提交方式(同步,提交任务之后,原地等待任务的返回结果,期间不干任何事 异步,提交任务后不等待直接执行写一行代码,返回的任务通过回调机制),
阻塞非阻塞,程序的运行状态(程序运行的三种状态图)
局部刷新
页面的某个地方局部刷新,
eg:展示一个前端页面 页面上有三个输入框 前两个框输入数字 点击按钮朝后端发请求页面不刷新的情况下 完成数字的加法运算
<input type='text' id='t1'>+<input type='text' id='t2'>=<input type='text' id='t3'>
<p><button id='b1'>计算</button></p>
$.ajax({
//1.想哪里发送数据
url:'',//专门控制向后端提交数据的地址,不写默认当前地址
//2.到底发送什么请求
type:'post',//专门定制ajax发送的请求方式
//3.发送的数据到底是什么
date:{'t1':$('#t1').val(),'t2':$('#t2').val()}
//4.异步提交的任务,需要通过回调函数来处理
success:function(data){//data形参代指的就是异步提交的返回结果
//通过DOM操作将内容渲染到标签内容上
$('#t3').val(data)}
})
ajax传json数据
django后端针对json数据,不会解析,放在request.body中
也可以手动处理
手动处理方式,json反序列化
json_bytes = request.body
json_str = str(json_bytes,encoding='utf-8')
json_dict = json.loads(json_str)
注意事项:1.指定contentType参数 contentType:'application/json',2.确保数据json格式 data:JSON.stringify({}),
ajax传文件
需要利用内置对象Formadata
该对象既可以传普通键值对,也可以穿文件
获取用户上传的文件的内容
1.先通过jQuery查找到该标签,2.将jQuery对象转换成原生的js对象,3.利用原生js对象的方法,直接获取文件内容$('#3').files[0]
上传:
创建formdata对象
append(),加入上传文件
注意事项:
contentType:false
processDatafalse
contentType前后端传输数据编码格式
form表单 默认提交方式urlendoded
urlencoded
xxx=xxx&xxx=xxx
django后端针对这种数据格式自动解析,打包给request.POST
formdata
也会解析,不过不会放在request.POST,而是放在request.FILES中
ajax默认提交方式urlencoded
总结:django后端针对不同的编码格式,会有不同的处理机制以及不同的获取该数据点的方法
前后端数据交互时一定要表名自己发的什么格式
序列化组件,
将用户表数据查询出来传给前端,给前端的是一个大字典,字典里面数据的一个个字段
from django.core import serializers
def ser(request):
user_queryset = models.Userinfo.objects.all()
# [{},{},{},{}]
# user_list = []
# for user_obj in user_queryset:
# user_list.append({
# 'username':user_obj.username,
# 'password':user_obj.password,
# 'gender':user_obj.get_gender_display(),
# })
res = serializers.serialize('json',user_queryset)
print(res)
return render(request,'ser.html',locals())
使用ajax交互的时候,可以考虑给前端