django之orm
一 orm创建sql表
1.新建django项目。在项目文件夹下的settings修改配置(将原来的DATABASES隐掉):
2.在项目的init文件中写入如下命令
3.开始创建表格:在应用文件夹的models.py文件中创建类:
4.数据库同步指令:
(1)python manage.py makemigrations
(2)python manage.py migrate
5.查看mysql中的生成情况
二 orm的增删改查
增删改查操作命令写在 view视图函数中。Urls里面要配置好相应的路径:
url(r'^index/', views.index),
在浏览器中访问该页面,就执行index函数,执行增删改查操作。
首先在views.py里导入models文件。增删改查操作写在index函数中
from app01 import models
1.增加记录
方式一: student_obj=models.Students( name='abc', age=22, ) student_obj.save() 方式二: new_obj=models.Students.objects.create(name='ABC',age=25) print(new_obj) #Student object model对象(表对象) print(new_obj.name,new_obj.age) 创建方式三:批量创建 bulk_creat方法 速度快。不用向上面一次次save,io操作耗时间 objs_list=[] for i in range(20): obj=models.Students( name='zhao%s'%i, age=10+i, ) objs_list.append(obj) models.Students.objects.bulk_create(objs_list) 创建方式4:update_or_create() 有就更新,没就创建 models.Students.objects.update_or_create( name='哥哥', defaults={ 'age':35, } )
2.查询
(1)查询所有的 all()方法
all_obj=models.Students.objects.all() print(all_obj)
查询结果是queryset集合(类似列表)。可以通过for循环,通过属性的方式拿到里面的值。< QuerySet[ < Students: Students object>>
也可以在创建类的里面自定制__str__方法,返回值为self.name。这样Print(all_obj)时,里面的queryset对象的值为name。如< QuerySet[ < Students: abc >>
(2)条件查询 .filter方法 返回的也是queryset集合
objs=models.Students.objects.filter(id=2) #找id为2的记录 objs=models.Students.objects.filter(name='abc') #找name为'abc'的记录 print(objs)
(2)条件查询:get()方法 返回的是model对象
obj=models.Students.objects.get(id=3) #找id为3的记录 print(obj)
get()查找有且必须只有一个结果。如果查找的结果为0,或者为多个,那么将报错。(页面得不到结果)
3.删除 delete()方法 queryset和model对象都可以调用
models.Students.objects.get(id=3).delete() #model对象来调用的delete方法 models.Students.objects.filter(name='abc').delete() models.Students.objects.all().delete() #删所有的
4.更新 update()方法 只有queryset对象可以调用update()方法
models.Students.objects.get(id=6).update(age=99) #报错 model对象不能调用更新方法 报错信息:Student object has no attribute update models.Students.objects.filter(id=6).update(age=99)
三 orm查询
1.查询
(1)filter
models.Students.objects.filter(id=7,name='哥哥').update( #,是and关系 name='妹妹', age=18, )
,表示是and关系。
id=7,name='哥哥'是以关键字形式传入。也可以写成字典形式,但前面加**
如:models.Students.objects.filter(**{'id':'7','name':'妹妹'}).update(age=28)
(2) exclude(**kwargs) :排除,objects控制器和queryset集合都可以调用,返回结果是queryset类型
query=models.Students.objects.exclude(id=10) #objects控制器调用 query = models.Students.objects.filter(name='abc').exclude(id=10) #queryset集合调用
(3)排序 order_by
query=models.Students.objects.all().order_by('age','id') #'-id' 按id降序排序 。先按age排序,相同的再按id排序
(4)反转 reverse
反转在排序之后才有用
如: query = models.Students.objects.all().order_by('id').reverse() 这样就不行 query = models.Students.objects.all().reverse()
(5)count计数 queryset调用,返回数字
num=models.Students.objects.all().count()
(6)first()、last() 返回第一条、最后一条记录 返回的是记录(model对象)
obj=models.Students.objects.all().first()
(7)exits() 返回布尔值
obj=models.Students.objects.filter(name='姐姐').exists() #比if判断效率高
(8)alue_list 、values返回queryset类型
query=models.Students.objects.filter(age=18).value_list()
加上value_list,打印对象由<Queryset[Students:哥哥],[],[]>变为<Queryset [(1,'哥哥',18),(),()]> 元祖
返回指定字段,就在value_list()里加入字段
query=models.Students.objects.filter(age=18).value_list(‘name’,’age’) query=models.Students.objects.filter(age=28).values() #values('name','age')
(9)去重 distinct 放在values和value_list后面
query=models.Students.objects.all().distinct() #distinct()里不能加field .all()方法去重没意义 query = models.Students.objects.all().values('age').distinct()
2.模糊查询
基于双下划线的模糊查询 filter()
(1)大于 __gt
# query=models.Students.objects.filter(id__gt=7) # id__gt=7 表示id>7
(2)大于等于 __gte
query=models.Students.objects.filter(id__gte=7) # id__gte=7 表示id>=7
(3)小于、小于都等于 __lt __lte
query=models.Students.objects.filter(id__lt=7) # id__lt=7 表示id<7
(4)在列表之中 __in
query=models.Students.objects.filter(id__in=[6,8,10]) #表示id在后面列表之中的
(5)在区间范围内(闭区间) __range
query=models.Students.objects.filter(id__range=(8,10)) # 8<=id<=10 between and
(6)包含字符串 __contains __icontains(不区分大小写)
query=models.Students.objects.filter(name__contains='妹妹') # name字段里有"妹妹"字符串 (必须是字符串类型)
(7)__endswith、__startswith 以什么结尾,以什么开头。 前面也可以加i。不区分大小写。
3.日期相关操作
(1)插入日期
import datetime current_date=datetime.datetime.now() models.Birthday.objects.create(name='zhao',date=current_date)
也可以直接插入字符串
models.Birthday.objects.create(name='yang',date='1999-1-9') #传字符串进去也行
(2)查询
query=models.Birthday.objects.filter(date__year='2000') #查询日期年份为2000 query=models.Birthday.objects.filter(date__year='2000',date__month='12') #查询日期年份为2000,月份为12月的 date__day__gt=8 #日期大于8号的