一、前言
前面在模型系统第一节中我们已经在数据库中创建好了student_user表,在本节中我会用shell来演示数据的增删改查
①在虚拟环境中 安装ipython(操作比较方便)
pip install ipython
②在项目目录下 打开shell
二、增
① 方法一
去数据库中查看,如下图所示,可以看到,数据已添加
② 方法二
③ 方法三(直接创建):
④ 方法四:
get_or_create(参数):它会根据参数去数据库中查找,若找到与之匹配的,则返回False,若没有找到,就会根据参数创建一条新的数据并返回True
此时数据库中的数据如下图所示:
三、查
① 查询所有记录对象
由上图可知,s为一个QuerySet对象(查询集)
关于QuerySet |
---|
从数据库中查询出来的结果一般是一个集合,这个集合叫QuerySet |
QuerySet是可迭代对象,支持链式操作(方法后可再接方法) |
QuerySet支持切片、索引,但不支持负索引 |
可以用list强行将QuerySet转换成列表 |
② 查询一个对象
由上图可知,get()方法返回的是单个对象,如果符合条件的对象有两个或多个,就会报错!!!
③ 查询满足条件的对象
注意:all()和filter()返回的都是QuerySet对象,而get()方法返回的是单个对象
四、改
① 先查到对象再给其属性赋值进行修改
由下图可知bob年龄已修改为20
② 使用update方法直接修改
注意:单个对象是没有update这个方法的,只能通过给属性赋值来修改
五、删
① 删除单个,可看到,bob已经被删除了
② 删除所有,删完后变为空的QuerySet
六、常用的查询方法
解释说明 | 方法案例 |
---|---|
获取第一条数据,返回的是对象 | rs = User.objects.first() |
获取最后一条数据,返回的是对象 | rs = User.objects.last() |
只查询单个字段 | rs = User.objects.only(‘id’) |
除了这个字段不查,其它都查,与only作用相反 | rs = User.objects.differ(‘id’) |
根据参数提供的条件获取过滤后的记录 | rs = User.objects.filter(name=‘bob’) |
排除name为bob的记录,与filter作用相反 | rs = User.objects.exclude(name=‘bob’) |
对字段进行排序,默认对结果进行从小到大排序 | rs = User.objects.order_by(‘age’) |
逆向排序,只需在字段前加个负号即可,返回查询集,按从大到小排序 | rs = User.objects.order_by(’-age’) |
多项排序 | rs = User.objects.order_by(‘id’, ‘age’) |
将返回来的QuerySet中的Model转换为字典 | rs = User.objects.all().values() |
获取当前查询到的数据的总数 | rs = User.objects.count() |
exact(相当于等号),配合filter使用 | rs = User.objects.filter(name__exact = ‘bob’) |
contains(包含) | rs =User.objects.filter(name__contains = ‘bob’) |
startswith(以什么开头) | rs = User.objects.filter(name__startswith = ‘bob’) |
ends(以什么结束) | rs = User.objects.filter(name__endswith = ‘bob’) |
iexact, icontains, istartswith, iendswith | 可忽略大小写 |
in(成员所属) | rs = User.objects.filter(age__in = [18, 19, 20]) |
range(范围),两边均可取到 | rs = User.objects.filter(age__range(18, 20)) |
gt(大于), gte(大于等于) | rs = User.objects.filter(age__gt = 20) |
lt(小于), lte(小于等于) | rs = User.objects.filter(age__lt = 20) |
isnull(判断是否为空) | rs = User.objects.filter(name__isnull = True) |
- 多条件的or连接查询
案例:查询年龄为18或20的用户
- 聚合与分组