7、模型层(单表查询和双下划线查询)
一、Django测试环境的搭建
当我们只想测试Django中某一个文件的内容,可以不需要写前后端交互的方式,而是写一个测试脚本,通常都是使用应用文件夹里面的test文件。
如果我们直接写命令,会报错,需要进行配置才可以使用
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoProject01.settings") # 这里的djangoProject01.setting是Django项目名字。
import django
django.setup()
# 你就可以在下面测试django任何的py文件(测试所写的代码必须都在下面,包括导入模块也是)
二、单表查询
1、数据的增加
models.User.objects.create(username='poco',password=321)
'''
User是models文件的创建了表的类名,可以把它看做表名,
create就是增加的意思,username是User表的字段,'poco'就是为其增加的数据
'''
2、数据的删除
res = models.User.objects.filter(pk=2).delete()
'''
filter代表过滤器,pk是自动查找当前表的主键字段,用pk查找就不需要知道当前表的主键字段叫什么了。
返回值是返回所影响的行数(表示删了几行数据)
'''
3、数据的修改
models.User.objects.filter(pk=3).update(name='wendy')
'''查找主键id叫做3的字段,将字段name的数据修改成wendy'''
4、数据查询的必知必会的13条
1、all() 查询所有
res = models.User.objects.all() # 惰性查询,直接查找表的所有数据
2、filter() 根据条件查询
res = models.User.objects.filter(pk=2) # 查询主键为2的数据
res = models.User.objects.filter(username='poco') # 查询username字段值为poco的数据
'''filter相当于选择器,根据括号的条件进行查询符合条件的数据'''
3、get() 根据条件查询,不符合条件会报错
res = models.User.objects.get(password='123')
'''不推荐使用,因为只要找不到数据就直接报错了。查询到的数据是数据对象本身'''
4、first() 拿第一个
res = models.User.objects.first() # 数据类型:数据对象本身
'''会拿到表的第一个数据'''
5、last() 拿最后一个
res = models.User.objects.last() # 数据类型:数据对象本身
'''会拿到表的最后一个数据'''
6、values() 指定获取的数据字段
res = models.User.objects.values('username') # 数据类型:QuerySet
'''
只拿User表的username字段的数据,它的返回结果会是列表套字典的格式,如下
<QuerySet [{'username': 'poco'}, {'username': 'wendy'}]>
'''
7、values_list() 列表套元组
res = models.User.objects.values_list('username') # 数据类型:QuerySet
'''
只拿User表的username字段的数据,它的返回结果会是列表套元组的格式
<QuerySet [('poco',), ('wendy',)]>
'''
8、distinct() 去重(数据包括主键必须一模一样才能去重)
'''比如说我们用户表里有两个用户名都叫poco,密码都是123'''
res = models.User.objects.all().distinct()
'''查寻所有数据,然后去重,发现无法去重。因为忽略了主键,
这两个用户虽然用户名和密码一样,但主键可不一样,所以没法去重'''
res1 = models.User.objects.values('username','password').distinct()
'''这样我们筛选出条件,那么对象只有用户名和密码,就可以去重了'''
9、order_by() 排序:默认是升序,价格负号就是降序
res = models.User.objects.order_by('password')
res1 = models.User.objects.order_by('-password')
# 可以在后面继续加order_by条件,当相同的时候,按照某种条件来排序。
10、reverse() 前面必须是排序结果才能反转,否则不作处理,但是不会报错。
res = models.User.objects.order_by('password').reverse()
'''反转的前提是 数据必须有序'''
11、count() 统计数据的个数
res = models.User.objects.count()
'''表里就几条数据 就显示数字几'''
12、exclude() 除此之外
res = models.User.objects.exclude(username='poco')
'''结果是除此之外的所有数据,后面还可以跟查询。数据类型:QuerySet'''
13、exists() 判断是否存在
res = models.User.objects.filter(pk=1).exists()
# 判断主键值为1的是否存在,返回true或者false,这玩意很鸡肋,基本用不上
神奇的双下划线查询
# 查询价格大于200的书籍
res = models.Book.objects.filter(price__gt=200)
# 查询价格小于200的书籍
res = models.Book.objects.filter(price__lt=200)
# 查询价格大于或者等于200的书籍
res = models.Book.objects.filter(price__gte=200)
# 查询价格小于或者等于200的书籍
res = models.Book.objects.filter(price__lte=200)
# 查询价格是299和198的书籍
res = models.Book.objects.filter(price__in=[299, 198])
# 查询价格在200与500之间的书籍(顾头不顾尾)
res = models.Book.objects.filter(price__range=(200, 500))
# 查询书籍名称中包含p的
res = models.Book.objects.filter(title__contains='p') # 区分大小写
res = models.Book.objects.filter(title__icontains='p') # 忽略大小写
# 查询书籍名称是以三开头的书籍
res = models.Book.objects.filter(title__startswith='C')
# 查询书籍名称是以p结束的书籍
res = models.Book.objects.filter(title__endswith='门')
# 查询出版日期是2020年的书籍
res = models.Book.objects.filter(publish_date__year='202')
# 查询出版日期是10月的书籍
res = models.Book.objects.filter(publish_date__month='10')

浙公网安备 33010602011771号