一、增
增加数据有两种方法
1、save
通过创建模型类对象,执行对象的save()方法保存到数据库中
sp = ServiceProcess() # models.py中的表对象
sp.id=22
sp.pid =8888
sp.save()
2、create
通过模型类.objects.create()保存。
ServiceProcess.objects.create(
id=77,
pid =89543)
二、查
1、基本查询
get :查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
all :查询多个结果。
count :查询结果数量
1.1 get
sp = ServiceProcess.objects.get(pid=8888)
print(p.id)
1.2 all
sp = ServiceProcess.objects.all()
1.3 count
ServiceProcess.objects.count()
2、过滤查询
实现SQL中的where功能,包括:
filter 过滤出多个结果
exclude 排除掉符合条件剩下的结果
get 过滤单一结果
过滤条件的表达语法如下:
属性名称__比较运算符=值
# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
exact:表示判等。
contains:是否包含。
startswith、endswith:以指定值开头或结尾。
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.
isnull:是否为null。
in:是否包含在范围内。
gt :大于 (greater then)
gte :大于等于 (greater then equal)
lt :小于 (less then)
lte :小于等于 (less then equal)
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
F对象
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢?
使用F对象,被定义在django.db.models中!
语法如下:
F(属性名)
ServiceProcess.objects.filter(pid__gte=F('id')) # 查询pid大于id的数据
可以在F对象上使用算数运算。
ServiceProcess.objects.filter(pid__gte=F('id')*2) # 查询pid大于2倍id的数据
Q对象
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
ServiceProcess.objects.filter(pid__gt=20,id_lt=3) # pid大于20,id小于3的数据
如果需要实现逻辑or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
语法如下:
Q(属性名_运算符=值)
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
ServiceProcess.objects.filter(Q(pid__gt=20) | Q(id_lt=3)) # pid大于20或id小于3的数据
Q对象前可以使用~操作符,表示not。
ServiceProcess.objects.filter(~Q(pid=20)) # pid不等于20数据
聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg(平均),Count(数量),Max(最大),Min(最小),Sum(求和),被定义在django.db.models中。
ServiceProcess.objects.aggregate(Max('pid')) # 最大pid的数据
3、排序
使用order_by对结果进行排序。-属性表示降序。
ServiceProcess.objects.all.order_by('pid') # 升序
ServiceProcess.objects.all.order_by('-pid') # 降序
4、关联查询(多表查询)
table_a中的一条记录唯一关联table_b中的一条记录
table_b中的记录可以被table_a中的多条记录关联
此时,此时模型类A简称多类,模型类B成为一类
由一到多的访问语法:一类对象.多类名小写_set.all()。
例如:在HeroInfo和BookInfo中,BookInfo为一类,而HeroInfo为多类,则通过BookInfo的对象查询对应的HeroInfo对象的方式为:
books = BookInfo.objects.all()
for book in books:
for hero in book.heroinfo_set.all():
print(hero.hero_name)
由多到一的访问语法: 多类对象.关联属性
例如:在HeroInfo和BookInfo中,BookInfo为一类,而HeroInfo为多类,多类中有一个关联属性hero_book,则通过HeroInfo的对象查询对应的BookInfo对象的方式为:
from booktest.models import BookInfo, HeroInfo
for hero in HeroInfo.objects.all():
print(hero.hero_book.book_title)
三、改
修改更新有两种方法
1、save
修改模型类对象的属性,然后执行save()方法
hero = HeroInfo.objects.get(hname='猪八戒')
hero.hname = '猪悟能'hero.save()
2、update
使用模型类.objects.filter().update(),会返回受影响的行数
HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
四、删
删除有两种方法
1、模型类对象.delete
hero = HeroInfo.objects.get(id=13)
hero.delete()
2、模型类.objects.filter().delete()
HeroInfo.objects.filter(id=14).delete()