ORM单表操作
类 --- 表
类对象 --- 一行数据
类属性 --- 字段
增
#创建记录方式一
student_obj = models.Student(
name='大壮',
age=48,
)
student_obj.save()
#创建记录方式二
models.Student.objects 对象控制器
new_obj = models.Student.objects.create(name='雪飞',age=18) #也可写成**{'name':'雪飞','age':18}
print(new_obj) # Student object -- model对象 .属性可以获取对应字段的数据
print(new_obj.name) # 雪飞
print(new_obj.age) # 18
#创建记录方式三 -- 批量创建1
objs = []
for i in range(20):
obj = models.Student(
name='玉溪%s'%i,
age=10+i,
)
objs.append(obj)
models.Student.objects.bulk_create(objs)
#创建记录方式四 -- 有则更新无则添加 update_or_create
models.Student.objects.update_or_create(
name = '双喜',
defaults={
'age':26
}
)
# 添加日期数据
# 方式一 datetime.datetime对象
import datetime
current_date = datetime.datetime.now()
models.Birthday.objects.create(name='小智',date=current_date)
# 方式二 字符串
models.Birthday.objects.create(name='路比',date='2000-6-18')
删
#删除 delete
models.Student.objects.get(id=1).delete() # 用model对象调用delete方法(get方法返回的是model对象)
models.Student.objects.filter(name='阿强').delete() # 用queryset对象也可调用delete方法
models.Student.objects.all().delete() # 删除所有数据
改
#更新
models.Student.objects.get(name='阿强').update(age=30) # model对象没有更新方法 报错信息:'Student' object has no attribute 'update'
models.Student.objects.filter(name='阿强').update(age=30) # 只能queryset对象调用
查 (简单)
简单查询(三剑客 all filter get)
1.查询所有的数据 .all方法 返回的是QuerySet集合
all_objs = models.Student.objects.all()
# print(all_objs) # <QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]> -- 类似于列表 -- queryset集合
# for i in all_objs:
# print(i.name) # 小智 小霞 小刚
print(all_objs) # < QuerySet[ < Student: 小智 >, < Student: 小霞 >, < Student: 小刚 >] >(改写了__str__)
2.条件查询 .filter方法 返回的是QuerySet集合,查询不到内容不会报错,返回<QuerySet []>
objs = models.Student.objects.filter(id=3) # 找id为3的记录
print(objs) # <QuerySet [<Student: 小刚>]>
3.条件查询 .get方法 返回的是model对象!而且get方法有且必须只有一个结果,否则报错(为空或者多了)!
objs = models.Student.objects.get(id=3) # 找id为3的记录
print(objs) # 小刚
查询接口
<1> all(): 查询所有结果,结果是queryset类型
<2> filter(**kwargs): 查询与所给筛选条件相匹配的对象,结果是queryset类型
#多条件
models.Student.objects.filter(id=7,name='吴尊').update(name='无极尊',age=27,)
#打散形式传参
models.Student.objects.filter(**{'id':7,'name':'无极尊'}).update(age=100,)
#queryset类型可以调用filter再过滤
models.Student.objects.all().filter(id=7)
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,model对象,返回结果有且只有一个,否则报错
<4> exclude(**kwargs): 排除符合条件的对象 object控制器和queryset集合都可以调用,返回结果是queryset类型
object控制器调用:
query = models.Student.objects.exclude(id=3)
QuerySet对象调用:
query = models.Student.objects.filter(age=26).exclude(id=24)
<5> order_by(*field): queryset类型的数据来调用,对查询结果排序,返回值还是queryset类型
query = models.Student.objects.all().order_by('age','-id') # 按age升序排,age相同的时候按id降序排
<6> reverse(): queryset类型的数据来调用,在排序的结果基础上反向排序,返回值还是queryset类型
query = models.Student.objects.all().order_by('id').reverse()
<7> count(): queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量(数字)。
num = models.Student.objects.all().count()
<8> first(): queryset类型的数据来调用,返回第一条记录,结果为model对象
<9> last(): queryset类型的数据来调用,返回最后一条记录,结果为model对象
<10> exists(): queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False
obj = models.Student.objects.all().filter(name='无极尊').exists()
if obj:print(obj)
else:print('nothing...')
<11> values(*field): 返回里面是字典的queryset类型(一个字典就是一行数据,字典的键就是字段)
query = models.Student.objects.filter(age=26).values()
print(query) # <QuerySet [{'id': 24, 'name': '相玺16', 'age': 26}, {'id': 28, 'name': '文洋', 'age': 26}]>
# values可以指定字段
query = models.Student.objects.filter(age=26).values('name','age')
<12> values_list(*field): 返回里面是元组的queryset类型(一个元组就是一行数据,元组里面的每一项对应一个字段)
query = models.Student.objects.filter(age=26).values_list()
print(query) # <QuerySet [(24, '相玺16', 26), (28, '文洋', 26)]>
# values_list也可以指定字段
query = models.Student.objects.filter(age=26).values_list('name','age')
<13> distinct(): values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录,返回结果还是queryset类型
models.Student.objects.all().values('age').distinct()
基于双下划线的模糊查询
# __ 找id>7的
query = models.Student.objects.filter(id__gt=7)
# __ 找id>=7的
query = models.Student.objects.filter(id__gte=7)
# 找id<7的
query = models.Student.objects.filter(id__lt=7)
# 找id<=7的
query = models.Student.objects.filter(id__lte=7)
# in
query = models.Student.objects.filter(id__in=[7, 8, 9]) # id值等于这三个里面的任意一个的对象
# 范围 相当于between...and...
query = models.Student.objects.filter(id__range=[5,10]) # id值在[5,10]内的
# 找name字段里有'相玺'的对象,只适用于字符串类型的字段
query = models.Student.objects.filter(name__contains='相玺')
# contains基础上 + 不区分大小写
query = models.Student.objects.filter(name__icontains='python')
# 找name字段以'相'开头的对象, istartswith 不区分大小写
query = models.Student.objects.filter(name__startswith='相')
# 找name字段以'飞'结尾的对象, iendswith 不区分大小写
query = models.Student.objects.filter(name__endswith='飞')
# 日期结合__查询:
# 找出生年为2000,月为07月的
query = models.Birthday.objects.filter(date__year='2000',date__month='07')
# 找出生年为2000,月为07月,日大于10的
query = models.Birthday.objects.filter(date__year='2000',date__month='07',date__day__gt='10')
# 以此类推......