今日考题
1.聚合查询和分组查询的关键字是什么?各有什么注意事项?
只要是跟数据库相关的模块一般都在django.db.models
from django.db.models import Max,Min,Avg,Sum,Count
res = models.Book.onjects.aggregrate(Avg('price'))
res = models.Book.object.annotate(author_num=Count('authors')).values('title','author_num')
models后面点书就按照书分组,author_num是我们自己定义的字段 用来存储统计出来的每本书对应的作者个数
2.F与Q查询的功能,他们的导入语句是什么,针对Q有没有其他的用法
from django.db.models import F
models.Book.objects.filter(mauchu__gt=F('kucun')).first()
models.Book.objects.update(F('price')+500)
from django.db.models import Value
from django.db.models.functions import Concat
models.Book.objects.update(title=Concat(F('title'),Value('爆款')))
from django.db.models import Q
models.Book.objects.filter(Q(maichu__gt=800),Q(kuncun__lt=600))
models.Book.objects.filter(Q(maichu__gt=800)|Q(kuncun__lt=600))
models.Book.objects.filter(Q(maichu__gt=800),Q(kuncun__lt=600))
q.children.append('maichu__gt',800)
q.children.append('kucun__lt',600)
models.Book.objects.filter(q)
3.列举常见的数据字段及主要参数(越多越好)
auto_now_add 只在创建数据的时候记录创建时间后续不在改动
4.orm数据库查询优化有那些?各有什么特点?
orm 语句特点是:惰性查询,如果你只是书写了orm语句后面并没有用到该语句查询出来的参数 那么orm语句会自动识别 不执行
res = models.Book.objects.only('title')
defer刚好与only相反,括号内的字段需要重新走数据库查询,外的字段不需要
res = models.Book.objects.all()
res = models.Book.objects.select_relate('publish')
select_related内部现将book与publish连起来 然后将大表里面的所有数据对象全部封装给查询出来的对象
这个时候对象无论是点击book表中的数据还是publish表中的数据都无需再走数据库查询 网络请求越少延迟越低 也就是优化数据库查询
select_related括号内只能放外键字段 一对一 一对多 多对多也不行
res = models.Book.objects.prefetch_relate('publish')
prefetch_related该方法内部就是子查询
今日内容概要
- 图书管理的增删改查
- choices参数(数据库字段设计常见)
- MTV与MVC模型
- 多对多关系的三种创建方式
- Ajax操作(重点)
- 前后端传送数据编码格式
- ajax发送json格式数据
- ajax发送文件
- django自带的序列化功能
- ajax结合sweetalert实现删除的二次确认操作
今日内容详细
图书管理的增删改查
from django.conf.urls import url
from django.contrib import admin
url(r'^admin/', admin.site.urls),
url(r'^$',views.home,name='home'),
url(r'^book/list/',views.book_list,name='book_list'),
url(r'^book/add/',views.book_add,name='book_add'),
url(r'^book/edit/(?P\d+)',views.book_edit,name='book_id'),
url(r'^book/delete/(\d+)',views.book_delete,name='book_delete'),
from django.shortcuts import render,HttpResponse,redirect
return render(request,'home.html')
book_obj = models.Book.objects.all()
return render(request,'book_list.html',locals())
if request.method=='POST':
title = request.POST.get('title')
price = request.POST.get('price')
publish_date = request.POST.get('publish_date')
publish_id = request.POST.get('publish')
authors_list = request.POST.getlist('authors')
book_obj = models.Book.objects.create(title=title,price=price,publish_date=publish_date,publish_id=publish_id)
book_obj.authors.add(*authors_list)
redirect括号内可以直接写url 其实也可以写别名
但是如果你的别名需要额外传参的话,那么就必须使用reverse()解析
return redirect('book_list')
publish_obj = models.Publish.objects.all()
authors_obj = models.Author.objects.all()
return render(request,'book_add.html',locals())
def book_edit(request,edit_id):
edit_obj = models.Book.objects.filter(pk=edit_id).first()
publish_obj = models.Publish.objects.all()
authors_obj = models.Author.objects.all()
if request.method == 'POST':
title = request.POST.get('title')
price = request.POST.get('price')
publish_date = request.POST.get('publish_date')
publish_id = request.POST.get('publish')
authors_list = request.POST.getlist('authors')
models.Book.objects.filter(pk=edit_id).update(title=title,
publish_date=publish_date,
edit_obj.authors.set(authors_list)
return redirect('book_list')
return render(request,'book_edit.html',locals())
def book_delete(request,delete_id):
models.Book.objects.filter(pk=delete_id).delete()
return redirect('book_list')

choices参数(数据库字段设计常见)
class User(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
gender = models.IntegerField(choices=gender_choices)
该gender字段存的还是数字,只不过数字对应元组关系。如果存的数字在上面元组列举的范围内,那么可以轻松获取到数字对应的内容
1.gender字段存的数字不在上述元组列举的范围内容
MTV与MCV模型
多对多关系的三种创建方式
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
优点:代码不需要你写,支持orm提供的操作第三方表关系
class Author(models.Model):
name = models.CharField(max_length=32)
class Book(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id=models.ForeignKey(to='Author')
写的代码较多,并且不支持orm提供的简单方法操作第三方表
class Book(models.Model):
name = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author',
through_fields=('book','author')
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面
半自动:可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法
# 你需要掌握的是全自动和半自动为了扩展性更高,一般我们会采用半自动

Ajax
动态获取用户名实时的跟后端确认并实时展示的前端(局部刷新)
AJAX 不是新的编程语言,而是一种使用现有标准的新方法(比较装饰器)
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
Ajax我们只学习jQuery封装之后的版本(不学原生的 原生的复杂并且在实际项目中也一般不用)
所以我们在前端页面使用ajax的时候需要确保导入了jQuery
ps:并不只有jQuery能够实现ajax,其他的框架也可以 但是换汤不换药 原理是一样的
小例子
在前两个框中输入数字 点击按钮 朝后端发送ajax请求
后端计算出结果 再返回给前端动态展示的到第三个input框中
$('#btn').click(function () {
type:'post', // 不指定默认就是get 都是小写
data:{'i1':$('#d1').val(),'i2':$('#d2').val()},
// 4.回调函数:当后端给你返回结果的时候会自动触发 args接受后端的返回结果
success:function (args) {
针对后端如果是用HttpResponse返回的数据 回调函数不会自动帮你反序列化
如果后端直接用的是JsonResponse返回的数据 回调函数会自动帮你反序列化