我们继续昨天的内容使用Oracle中的emp,dept来学习Django ORM,今天做一些总结和扩展,希望你能有所收获。
先来说下两张表emp,dept。
emp表的数据如下:
dept表的数据如下:
然后我们就开始吧,有的同学说我的数据还没有初始化,可以移步上一篇找到脚本。
对于QuerysetAPI的内容,如果看文档有非常多的解释和介绍,很难抓到重点,我就从我的认知来梳理一下。
1. QuerySet 创建对象的方法
>>> fromscott.models importemp
>>> fromscott.models importdept
先得到所有的数据。
>>> emp.objects.all()
[ , , , , , , , , , , , , , ,]
>>> dept.objects.all()
[ , , ,]
第一种方法是使用create
>>> dept.objects.create( dname= 'DEV',loc= 'Beijing')
第二种是初始化另外一个对象,save完成
>>> newdept = dept( dname= 'TEST',loc= 'ShangHai')
>>> newdept.save()
第三种和第二种有些类似,可以对立面的属性根据需求改变。
>>> #method 3
>>> newdept.dname
'TEST'
>>> newdept=dept()
>>> newdept.dname
u''
>>> newdept.dname= 'OPS'
>>> newdept.loc= 'Guangzhou'
>>> newdept.save()
第四种会做一个判断,有点类似数据库立面的create or replace,注意此处的返回是一个布尔值。
>>> dept.objects.get_or_create( dname= 'DBA',loc= 'Shenzhen')
( ,True) 2.查询语句根据主键查询
>>> dept.objects.get( pk= 10)
得到top n的数据
>>> dept.objects.all()[: 5]
[ , , , ,]
使用get方法,返回的是一行
>>> dept.objects.get( dname= 'DBA')
使用filter的exact是精确匹配,和上面的方法是等价的。
>>> dept.objects.filter( dname__exact= 'DBA')
[]
忽略大小写
>>> dept.objects.filter( dname__iexact= 'DBA')
[]
查询内容排除包含ACC的部门
>>> dept.objects.exclude( dname__contains= 'ACC')
[ , , , , , ,]
>>>
可以过滤和排除操作都使用
>>> dept.objects.filter( dname__contains= 'DB').exclude( dname= 'MBA')
[] 3.删除这种方法是查到指定的数据,然后直接删除,还是有一些风险点的。
>>> dept.objects.filter( dname__contains= 'DB').delete()
或者分批删除
>>> dept.objects.all()
[ , , , , , ,]
>>> newdept=dept.objects.filter( dname__contains= 'DEV')
>>> newdept.delete()
全部删除 ,先不操作
dept.objects.all().delete() 4.更新使用filter来过滤得到数据,然后使用update来更新
>>> dept.objects.filter( dname__contains= 'TEST')
[]
>>> dept.objects.filter( dname__contains= 'TEST').update( dname= 'Test')
1L
>>>
>>> dept.objects.filter( dname__contains= 'Te')
[]
或者把初始化一个对象,更新这个对象
>>> newdept=dept.objects.get( dname= 'Test')
>>>
>>> newdept.dname
u'Test'
>>> dname= 'Test2'
>>> loc= 'Lanzhou'
>