子查询----》执行了两句sql,没有连表操作
一次查询,连表操作
放在ForeignKey,OneToOneField,ManyToManyField的
-related_name='books':双下滑线连表查询,反向查询按表名小写---》用来替换表名小写
publish__books__name
-related_query_name='books':基于对象跨表查,反向查询---》用来替换表名小写
pubilsh.book_set.all()
pubilsh.books.all()
-使用
select name,price,avg('price') as price__avg from book;
Book.objects.all().aggregate(Avg('price'))
select name,price,avg('price') as average_price from book;
Book.objects.aggregate(average_price=Avg('price'))
ret = Book.objects.all().aggregate(avg_price=Avg('price'), min_price=Min('price'))
-统计每一本书作者个数---》 Book.objects.all().values('id').annotate(author_num=Count("authors")).values('name','author_num')
-统计每一个出版社的最便宜的书---》按出版社
Publish.objects.all().valuse('id').annotate(min_price=Min("book__price")).vlaues('name','min_price')
Publish.objects.annotate(MinPrice=Min("book__price"))
-查询每一个书籍的名称,以及对应的作者个数-->按书分
Book.objects.all().values('id').annotate(count_publish=Count("authors")).value('name','count_publish')
-查询每一个以 红开头 书籍的名称,以及对应的作者个数-->按书分
Book.objects.all().filter(name__startswith='红')values('id').annotate(count_publish=Count("authors")).value('name','count_publish')
-查询每一个以 红开头 书籍的名称,以及对应的作者个数大于3的记录-->按书分
Book.objects.all().filter(name__startswith='红')values('id').annotate(count_publish=Count("authors")).filter(count_publish__gt=3).value('name','count_publish')
-查询评论数大于收藏数的书籍
from django.db.models import F
Book.objects.filter(评论数__gt=F('收藏数'))
-让所有图书价格 +1
Book.objects.all().update(price=F('price')+1)
-与条件:and条件,在filter中直接写---》就是and条件
Book.objects.filter(authors__name="lqz",price=100)
-或条件:Book.objects.filter(Q(authors__name="lqz")|Q(authors__name="justin"))
-非条件:Book.objects.filter(~Q(name='红楼梦'))
-复杂逻辑:(名字为红楼梦并且价格大于100) 或者 id 大于 2
Book.objects.filter((Q(name='红楼梦') & Q(price__gt=100))|Q(nid__gt=2))
to设置要关联的表
to_field 设置要关联的表的字段related_name 反向操作时,使用的字段名,用于代替原反向查询时的’表名_set’。
related_query_name 反向查询操作时,使用的连接前缀,用于替换表名。on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE删除关联数据,与之关联也删除
models.DO_NOTHING 删除关联数据,引发错误IntegrityError
models.PROTECT 删除关联数据,引发错误ProtectedError
models.SET_NULL删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)models.SET
删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
db_constraint---》公司一般都设置为False
是否在数据库中创建外键约束,默认为True
db_constraint=False 在数据库中不建立外键约束
虽然不建立数据库外键约束---》但是orm查询,继续用
用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系
to 设置要关联的表,中间是有个中间表的,区别于一对多
related_name 同ForeignKey字段。
related_query_name 同ForeignKey字段。
through
在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。
through_fields设置关联的字段。db_table 默认创建第三张表时,数据库中表的名称。
authors=models.ManyToManyField(to='Author',db_table='中间表表名')
book表
id name price
1 西游记 22
2 红楼梦 33
bookToauthors
id book_id author_id
1 1 1
2 1 2
author表
id name gender age
1 lqz 男 18
2 罗贯中 女 22
三张表都要手动创建--》3个类--》3个表模型---》
什么情况会使用手动创建?----中间表如果有多的字段,都是手动创建
authors=models.ManyToManyField(to='Author',through='booktoauthor', through_fields=('当前表--》到中间表的外键关系','剩下的写在第二个位置'))
book表
id name price
1 西游记 22
2 红楼梦 33
booktoauthor
id book_id author_id 日期
1 1 1
2 1 2
author表
id name gender age
1 lqz 男 18
2 罗贯中 女 22
不会在book或author表中加 ManyToManyField 字段了
book表
id name price
1 西游记 22
2 红楼梦 33
booktoauthor
id book_id author_id 日期
1 1 1
2 1 2
author表
id name gender age
1 lqz 男 18
2 罗贯中 女 22
class Author(models.Model):
name = models.CharField(max_length=32)
class Meta: #元信息
db_table
index_together
unique_together
ordering # 默认按id排序
作用:Javascript语言与服务器(django)进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)
同步交互:js发送出请求---》直到请求回来---》页面不能操作,不能点击
异步交互:js发出请求---》等待请求回来的过程中--->页面可以随意继续操作
使用:使用了jq帮咱们封装的方法 ajax ,名字跟ajax相同 $.ajax
真正的ajax原生,需要使用js操作,jq的ajax方法是对原生js的封装,方便咱们使用
-前后端混合项目中,我们通常使用jq的ajax实现 js和后端异步交互
-jq操作dom
-jq发ajax请求
-前后端分离项目中,我们会使用另一个第三方库,实现 js和后端异步交互(axios)
-只想发送ajax请求---》只用来发ajax请求的库
Title
写一个计算小案例--ajax
+ =
def demo01(requset):
if requset.method=='GET':
return render(requset,'demo01.html')
else:
one=int(requset.POST.get('one'))
two=int(requset.POST.get('two'))
return JsonResponse({'code':100,'msg':'计算成功','result':one+two})
Title
文件上传
def demo01(requset):
if requset.method=='GET':
return render(requset,'demo01.html')
else:
myfile=requset.FILES.get('myfile')
with open(myfile.name,'wb') as f:
for line in myfile:
f.write(line)
return JsonResponse({'code':100,'msg':'文件上传成功',})
$.ajax({
url: '/demo01/',
method: 'post',
contentType: 'application/json',
data: JSON.stringify({name: 'lqz', age: 19}), // 把对象转成字符串形式,json格式字符串
success: function (data) {
console.log(data)
}
})