本文共 3951 字,大约阅读时间需要 13 分钟。
【背景】
增/删/改/查 如何操作数据库
导入数据库的模型
1 | In [ 23 ]: from blog.models import People |
【增加记录】--三种方法
方法一: 直接使用数据模对象的create函数
In [24]: People.objects.create(name='shuaige')
Out[24]: <People: People object>
注意:创建成功返回对象地址
方法二:
1 2 | In [ 6 ]: record = People(name = 'choubaguai' ) In [ 7 ]: record.save() |
方法三:
1 2 3 | In [ 9 ]: record = People() In [ 10 ]: record.name = 'andy' In [ 11 ]: record.save() |
【删除记录】--找对对象,使用delete() 进行删除
第一找出你要删除的对象集合(id大于2的)
1 | In [ 19 ]: r_d = People.objects. filter (id__gt = 2 ) |
使用delete对象将其删除
1 2 | In [ 20 ]: r_d.delete() Out[ 20 ]: ( 3 , { 'blog.People' : 3 }) |
将返回珊瑚的条目数
【改记录】-先找出来,在将对象属性重新赋值
(将id=1的名字改成andyliu)
1 2 3 4 5 6 7 | In [ 21 ]: People.objects.values_list() Out[ 21 ]: [( 1 , 'liudehua' ), ( 2 , 'zhangxueyou' )] In [ 22 ]: r_m = People.objects.get( id = 1 ) In [ 23 ]: r_m.name = 'andyliu' In [ 24 ]: r_m.save() In [ 25 ]: People.objects.values_list() Out[ 25 ]: [( 1 , 'andyliu' ), ( 2 , 'zhangxueyou' )] |
【查】 这就相当于mysql中sql语句中的select语句,其中有很多字语句进行限制查询
1 获取所有记录对象
all_record = People.objects.all()
如果要获取对象值,需要先取出某一个对象,然后取出对象中的属性
1 2 3 4 5 6 7 8 | In [ 32 ]: for record in all_record: ....: print (record. id ) ....: print (record.name) ....: 1 andyliu 2 zhangxueyou |
2 获取某个域为指定值的对象
1 2 3 | In [ 11 ]: r_p = People.objects.get(name = 'zhangxueyou' ) In [ 12 ]: r_p. id Out[ 12 ]: 2 |
注意: 这个用法不常用,如果要用,你一定要保证,你查找的一定存在这样的一个记录,且必须是唯一,不然会报错哦
3 类似mysql中where进行的条件查询使用filter函数
第一: 整数的范围比较查询()
将id大于1的对象找出来,并以值列表的形式进行返回
1 2 | In [ 15 ]: People.objects. filter (id__gt = 1 ).values_list() Out[ 15 ]: [( 2 , 'zhangxueyou' ), ( 6 , 'andyliu' )] |
gt | 大于 |
gte | 大于等于 |
lt | 小于 |
lte | 小于等于 |
ne | 不等于 |
in(也可以是其他数据类型) | 位于给定列表中: People.objects.filter(id__in=[1, 3, 4]) 返回一个 polls 列表(ID 值分别是 1或3或4). |
1 2 | In [16]: People.objects.filter(name__in=['andyliu','zhangxueyou']) Out[16]: [<People: People object>, <People: People object>, <People: People object>] |
4 多过滤条件查询,有一种方法是,多次使用filter函数即可
1 2 3 4 | In [ 17 ]: People.objects. filter (id__gt = 1 ). filter (name = 'andyliu' ) Out[ 17 ]: [<People: People object >] In [ 18 ]: People.objects. filter (id__gt = 1 ). filter (name = 'andyliku' ) Out[ 18 ]: [] |
5 查找到的对象数据(即符合条件的记录的数目)
In [25]: People.objects.count()
Out[25]: 3
等于:
In [26]: People.objects.all().count()
Out[26]: 3
符合条件的长度
1 2 | In [ 24 ]: People.objects. filter (name = 'andyliu' ).count() Out[ 24 ]: 2 |
6 order_by()函数,进行升序/降序
-负数表示要进行降序排序
1 2 3 4 5 6 7 | In [ 14 ]: p = People.objects.order_by( '-id' ) In [ 15 ]: for i in p: print (i. id ) ....: 6 2 1 |
7 in list
1 2 3 4 | In [ 15 ]: Person.objects. filter (id__in = [ 1 , 2 ]).values_list() Out[ 15 ]: [( 1 , 'name1' , 22 ), ( 2 , 'name2' , 22 )] |
8 not in list(这里没有直接的not in list) 但是可以使用exclude,除外来等价
1 2 3 4 | In [ 16 ]: Person.objects.exclude(id__in = [ 1 , 2 ]).values_list() Out[ 16 ]: [( 3 , 'name3' , 22 ), ( 4 , 'name3' , 22 )] |
9. 包含关键字的(集合链式查询)
表中的所有数据:
1 2 | In [ 20 ]: Person.objects.values_list() Out[ 20 ]: [( 1 , 'name1' , 23 ), ( 2 , 'name2' , 22 ), ( 3 , 'name3' , 22 ), ( 4 , 'name3' , 22 )] |
name这个field包含name的关键字的record记录
1 2 | In [ 21 ]: Person.objects. filter (name__contains = "name" ).values_list() Out[ 21 ]: [( 1 , 'name1' , 23 ), ( 2 , 'name2' , 22 ), ( 3 , 'name3' , 22 ), ( 4 , 'name3' , 22 )] |
name这个field包含name的关键字的record记录并且年龄age字段不能等于23的! 使用链式查询
1 2 | In [ 23 ]: Person.objects. filter (name__contains = "name" ).exclude(age = 23 ).values_list() Out[ 23 ]: [( 2 , 'name2' , 22 ), ( 3 , 'name3' , 22 ), ( 4 , 'name3' , 22 )] |
以上需求用filter进行等价操作,取出22岁的
1 2 | In [ 24 ]: Person.objects. filter (name__contains = "name" ). filter (age = 22 ).values_list() Out[ 24 ]: [( 2 , 'name2' , 22 ), ( 3 , 'name3' , 22 ), ( 4 , 'name3' , |
10 对象索引,类似python 列表中的切片
In [29]: Person.objects.all()[1:3]
Out[29]: [<Person: Person object>, <Person: Person object>]
In [30]: Person.objects.all()[1:3].values_list()
Out[30]: [(2, 'name2', 22), (3, 'name3', 22)]
但是不知持负索引(会报错),如
Person.objects.all()[-1]
取代的方法:使用reverse方法来解决
11. 哈哈接下来可能是关于时间的查询(待续)