Django(四)-Django增删查改语句
一、数据库的增加
create()方法
语法: 模型名.objects.create(字段1=值1, 字段2=值2 …)
例如:Student.objects.create(s_name=‘小明’)
save()方法
save()方法是一个比较特殊的方法,可以进行增、改、查,使用的时候也很方便,例如:
# 1、先创建对象
stu = Student()
# 2、给对象对应字段赋值
stu.s_name = '小明1'
stu.s_gender = 1
# 3、保存
stu.save()
可见这个方法是很灵活的,查询以及更新后面对应的地方进行讲解。
二、数据库的删除
delete()方法
语法: 模型名.objects.filter(条件).delete()
例如:Student.objects.filter(id=2).delete()
注意:删除的时候,在Django中删除的是对象,对应数据库中是删除这个字段一行的数据。(不是删除整个表)
三、数据库的更新
update()方法
语法: 模型名.objects.filter(条件).update(字段1=值1, 字段2=值2 …)
例如:Student.objects.filter(id=4).update(s_name=‘小明’)
save()方法
与创建时的save()方法类似,但是在获取对象的时候,创建是直接创建一个新的对象,而更新是通过条件获取相应条件的对象,后对对应对象进行相应的处理。例如:
# 1、获取所需对象
stu = Student.objects.filter(id=4).first()
# 2、进行处理
stu.s_age = 18
# 3、保存
stu.save()
注意:这个例子中取出来的对象是object类型,不能直接使用,需要通过“.first()”方法将对象取出来。
四、数据库的查询
众所周知,在数据库的相关操作中,查询的操作将远远多于其他三个操作,所以,查询语句是非常重要的,下面就记录一些我在学习Django中使用过的一些方法。
filter()方法
语法:模型名.objects.filter(条件)
例如:stu = Student.objects.filter(id=5).first()
filter()方法是用得非常多的方法,在使用的时候稍稍注意一下就行,主要也是不要写错单词。
all()方法
语法:模型名.objects.all()
例如:stus = Student.objects.all()
这个方法在使用后返回的是整个数据库中所有的元素的信息,以列表的方式返回。
get()方法
语法:模型名.onjects.get(条件)
例如:stu = Student.objects.get(id=5)
注意:get()方法是查询指定的条件的对象,返回时只返回唯一的一个对象,并且查询的条件必须成立,否则报错。(不建议使用)
exclude()方法
语法:模型名.objects.exclude(条件)
例如:stus = Student.objects.exclude(s_gender=0)
exclude()方法作用为查询出不满足条件的信息,返回的是一个列表。
order_by()方法
语法:模型名.objects.order_by(字段)
例如:stus = Student.objects.order_by(‘id’)
注意:当括号中的字段为“正”时,表示为升序,为“负”时,表示为降序,即示例中以id字段进行排序,当为"id"时,表示以id的升序排序,当为"-id"时,表示以id的降序排序。
values()方法
语法:模型名.objects.(filter等查询条件).values(字段)
例如:stus = Student.objects.all().values(‘s_name’)
values()方法主要是取出查询对象中指定的字段,该方法在优化查询时的效果较好,推荐在查询部分字段时使用该方法。
exists()方法
语法:模型名.objects.(filter等查询条件).exists()
例如:a = Student.objects.filter(s_name=‘小张’).exists()
exists()方法主要是判断查询的数据是否存在,存在时返回True,否则返回False。
count()方法
语法:模型名.objects.(filter等查询条件).count()
例如:stus = Student.objects.filter(s_gender=1).count()
count()方法,顾名思义,查询符合条件的数据的条数,在计算数据数时比较实用。
filter()方法中的一些属性
contains属性
contains:主要作用是进行模糊查询,查询包含某个或多个字符的数据
语法:字段__contains
例如:stus = Student.objects.filter(s_name__contains=‘小明’) - 查询出来的结果为s_name字段中包含“小明”的所有数据。
startswith属性
startswith:也是模糊查询,但是与contains不一样的是startswith是查询以某个或多个字符开始的数据,包含完全匹配的字段
语法:字段__startswith
例如:stus = Student.objects.filter(s_name__startswith=‘小’)- 表示查询字段s_name以“小”开头的所有数据。
endswith属性
endswith::模糊查询,表示以某个或多个字符结束的数据,包含完全匹配的字段
语法:字段__endwith
例如:stus = Student.objects.filter(s_name__endswith=‘明’)- 表示以s_name字段中以”明“结尾的所有数据。
in属性
in:表示包含在什么之内。
语法:字段__in
例如:stus = Student.objects.filter(id__in=[1, 2, 3, 4, 5, 6, 7, 8])- 表示id字段的内容为”1, 2, 3, 4, 5, 6, 7, 8“中的一个时,将这个数据取出。
注意:当查询的字段为主键时,可以用pk表示这个字段,即当示例中的id为主键时,可以用一下查询语句表示:stus = Student.objects.filter(pk__in=[1, 2, 3, 4, 5, 6, 7, 8]),查询结果将与示例中的结果一样。
比较运算符
filter()方法中的比较运算符总共有:gte、lte、gt、lt四个:
属性 | 作用 |
---|---|
gte | 大于等于,语法:字段__gte |
lte | 小于等于,语法:字段__lte |
gt | 大于,语法:字段__gt |
lt | 小于,语法:字段__lt |
例如:stus = Student.objects.filter(s_age__gte=18, s_age__lt=20)- 表示查询s_age字段大于等于18且小于20的所有数据。
stus = Student.objects.filter(s_age__gte=18).filter(s_age__lt=20)- 这种写法的结果与上面的结果一样,只是写法不同。
聚合操作
聚合操作主要是求和、求差、求最大、求最小、求平均等,但是在Django中需要对这个关键字进行导包,导包语句:from django.db.models import Avg, Max, Min, Sum, Count
例如:
# 求数据库中所有数据某个字段的平均值:
age_avg = Student.objects.all().aggregate(Avg(‘s_age’))
# 求数据库中所有数据某个字段的和:
age_sum = Student.objects.all().aggregate(Sum(‘s_age’))
逻辑运算
逻辑运算主要就是三个:与、或、非。
运算 | 使用方式 |
---|---|
与(且) | 使用&将各个条件连接起来:Q(条件1) & Q(条件2)或Q(条件1), Q(条件2),可以不用写时默认为且操作 |
或 | 使用 |
非 | 在条件前添加~: ~Q(条件) |
例如:
# 求s_age大于等于18且小于20的所有符合的数据:
stus = Student.objects.filter(Q(s_age__gte=18) & Q(s_age__lt=20))
# 求s_age大于等于18或小于20的所有符合的数据:
stus = Student.objects.filter(Q(s_age__gte=18) | Q(s_age__lt=20))
# 求s_age不小于18的所有符合的数据:
stus = Student.objects.filter(~Q(s_age__gte=18))
将两个字段进行匹配(F()):
示例:查询物理成绩大于数学成绩的学生
stus = Student.objects.filter(physics__gt=F(‘math’))