模型中的CRUD
增加数据:
1.Entry.objects.create(属性1=值, 属性2=值,...)
返回值:
创建好的模型对象
def add_views(request):
# 三种增加方式
# 1.Entry.objects.create()
obj = Author.objects.create(name="Paris", age=18, email="wei8023@gmail.com")
print(obj.id, obj.name, obj.age, obj.email)
2.创建一个Entry对象 并通过save() 进行保存
obj = Entry(属性1=值1, ..)
obj.属性 = 值
obj.save()
没有返回值 保存成功后obj会被重新赋值
# 2.obj.save()
obj = Author(name="王大锤", age=32, email="laowang@email.com")
obj.save()
print(obj.id, obj.name, obj.age, obj.email)
3.使用字典构建成对象 并通过save()保存
dic = {
"属性1": "值1"
...
}
obj = Entry(**dic)
obj.save()
# 3. obj.save()
dic = {
"name": "wangdacui",
"age": 33,
"email": "wang@qq.com",
}
obj = Author(**dic)
obj.save()
print(obj.id, obj.name, obj.age, obj.email)
return HttpResponse("OK")
查询数据:
所有的查询 通过Entry.objects 调用查询接口函数
Entry.objects.filter()
所有的查询接口 都可以通过一个query属性来得到对应的sql语句
Entry.objects.filter().query
基本查询操作:
all()
Entry.objects.all()
返回queryset(查询结果集,是一个封装了若干个对象的列表)
def query_views(request):
# all() 查询所有Author实体中所用的数据
authors = Author.objects.all()
print(authors.query)
print(authors)
# 循环遍历authors得到每一个数据
for author in authors:
print(author.id, author.name, author.email)
查询返回指定列:
values()|values("字段1", "字段2"...)
Entry.objects.values()
Entry.objects.values("name", "age")
查询一个queryset中的部分列 并风封装成字典 再放到列表中
也允许将values放在其返回查询结果集的后面
# 查询部分列
names = Author.objects.values("name")
for name in names:
print(name["name"])
print(names)
# 在查询所有结果的基础上进行筛选
names = Author.objects.all().values("name")
for name in names:
print(name["name"])
查询返回指定列:
values_list()
将结果封装到元祖中在封装到列表中返回
用法同values
# 将查询结果封装到元组再封装到列表中
authors = Author.objects.values_list()
for author in authors:
print(author[0], author[2])
只查询一条数据:
get(条件)
查询只返回一条数据
Entry.objects.get(条件)
如果查询结果为空或者查询结果不是一条记录都会抛异常
# 只查询一条数据
author = Author.objects.get(id=1)
print(author)
查询部分行数据:
filter(条件1, 条件2,...)
Entry.objects.filter(条件)
使用逗号隔开表示使用and链接方式查询
Author.objects.filter(id=1, name="Paris")
# filter根据条件筛选
authors = Author.objects.filter(id=1)
print(authors.query)
print(authors)
# and方式查询
author = Author.objects.filter(id=2, name="Paris").values()
print(author)
在条件查询中 Django提供了若干个查询谓词(Field Looups)
可以完成非等值条件的查询
Entry.objects.filter(属性__查询谓词=值)
所有支持条件查询的地方都可以写谓词
filter(),get(),exclude()
# 查询所有age大于30的author信息
authors = Author.objects.filter(age__gt=30).values()
print(authors)
# 查询所有姓王的author信息
authors = Author.objects.filter(name__startswith="王").values()
print(authors)
# 查询所有email中包含wang的author信息
authors = Author.objects.filter(email__contains="wang")
print(authors)
对条件去反:
exclude(条件)
对现有条件进行取反操作查询
Entry.objects.exclude(条件)
# 对条件取反操作 查询年龄小于30的
author = Author.objects.exclude(age__gt=30).valuea()
聚合查询(无分组):
aggregate()
Entry.objects.all().aggregate(名=聚合函数("字段")
集合函数:
Avg() 平均值
Count() 数量
Sum() 求和
Min() 求最小
Max() 求最大
# 聚合函数
result = Author.objects.all().aggregate(avg=Avg("age"))
print(result)
聚合查询(有分组)
annotate()
Entry.objects.all().values("字段1", ...).annotate(字段=聚合函数()).values('字段1'...)
第一个values是用于做聚合分组 第二个是具体筛选的值
# 分组聚合
result = Author.objects.values("isActive").annotate(sum=Sum("age")).filter(isActive=True).all()
print(result)
排序查询:
order_by()
Entry.objects.order_by("字段1", "字段2")
默认升序 以列1进行排序 如果列1出现重复以列2进行排序
降序排序在列明前加"-"号
# 排序查询
result = Author.objects.order_by("-id")
for re in result:
print(re)
修改单个实体:
1.查
通过get()得到要修改的实体对象
2.改
通过对象的属性来修改对象的值
3.保存
通过对象的save()保存会数据库
def update1_views(request):
# # 修改ID为2 的author信息
au = Author.objects.get(id=2)
au.age = 33
au.email = "baidu@163.com"
au.isActive = False
au.save()
批量修改:
调用 QuerySet的update(属性=值, 属性=值) 实现批量修改
# 将isActive为False的数据 全部改为True
Author.objects.filter(isActive=False).update(isActive=True)
删除:
调用实体对象或查询结果集的delete()就可以删除
# 删除
author = Author.objects.get(id=1)
author.delete()
author = Author.objects.filter(name="Paris")
author.delete()
一般情况下很少有删除都是利用改变某个字段的状态来达到删除的效果
author = Author.objects.get(id=id)
# 通过修改状态模拟删除
author.isActive = False
author.save()
django转发与重定向的区别 转发:相当只有一个路由最终的结果是由一个视图函数处理
另一个视图只是做了一个调用另个函数的作用
重定向是访问 两个路由 分别由两个视图进行处理
转发不会改变url 只有一个请求 重定向会改变url 有两次请求
# 转发
# return query_all_views(request)
# 重定向
# return HttpResponseRedirect("/query_all")
return redirect("/query_all")