单表查询
Posted lizeqian1994
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单表查询相关的知识,希望对你有一定的参考价值。
‘‘‘ # mysql连接配置 DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘db_name‘, ‘HOST‘: ‘127.0.0.1‘, ‘USER‘: ‘root‘, ‘PASSWORD‘: ‘root‘ } } # 配置ORM的loggers日志 LOGGING = { ‘version‘: 1, ‘disable_existing_loggers‘: False, ‘handlers‘: { ‘console‘: { ‘level‘: ‘DEBUG‘, ‘class‘: ‘logging.StreamHandler‘, }, }, ‘loggers‘: { ‘django.db.backends‘: { ‘handlers‘: [‘console‘], ‘propagate‘: True, ‘level‘: ‘DEBUG‘, }, } } ‘‘‘ ‘‘‘ class User(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=16) age = models.IntegerField() birthday = models.DateField() ‘‘‘
‘‘‘ 1. 加载项目配置文件 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings") 2. 启动Django import django django.setup() 3. 使用项目中的各个模块 from my_app.models import User ‘‘‘
‘‘‘ 1. QuerySet是查询集,就是传到服务器上的url里面的内容。Django会对查询返回的结果集QerySet进行缓存,这里是为了提高查询效率。也就是说,在你创建一个QuerySet对象的时候,Django并不会立即向数据库发出查询命令,只有在你需要用到这个QuerySet的时候才回去数据库查询。 2. Objects是django实现的mvc框架中的数据层,django中的模型类都有一个objects对象,它是一个django中定义的QuerySet类型的对象,它包含了模型对象的实例。 简单的说,Objects是单个对象,QuerySet是许多对象。 QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作。只要你查询的时候才真正的操作数据库。 ‘‘‘
‘‘‘ User.objects.create(name=‘henry‘,age=‘30‘,birthday=‘1989-10-13‘) user = User(name=‘wendy‘,age=‘25‘,birthday=‘1994-8-28‘) user.save() ‘‘‘
‘‘‘ # 操作的结果是一个list,类型是queryset u_list = User.objects.filter(name=‘henry‘) # 只能操作有且只有一条数据的记录 user = User.objects.get(id=1) try: u2 = User.objects.get(name=‘wendy‘) print(u2) except Exception: print(‘wendy对象不唯一!‘) ‘‘‘
‘‘‘ User.objects.filter(id=2).update(birthday=‘1994-10-3‘) user=User.objects.filter(name=‘wendy‘)[0] user.birthday = ‘1994-8-28‘ user.save() ‘‘‘
‘‘‘ User.objects.filter(id=1).delete() user = User.objects.filter(name=‘wendy‘)[0] user.delete() ‘‘‘
‘‘‘ 1. all():查询所有结果list,类型是QuerySet,支持正向索引取值[i],支持索引切片[m:n] QuerySet对象具有query属性,里面存放的的是得到该结果执行的sql语句(ORM内部还存在对sql语句的优化) 支持正向索引(不支持反向索引,原因是数据过多时,不能将数据一次性查出,需要分批次按需求查出) u_l=User.objects.all()[1:3] 得到索引为1,2的两条数据 2. filter(**kwargs):查询结果是一个包含满足条件的所有数据的列表,类型为QuerySet 3. get(**kwargs):查询满足条件的唯一对象obj,查询结果不为obj则抛出异常 4. exclude(**kwargs):查询结果是一个包含满足条件的对立面的所有数据的列表,类型为QuerySet 5. order_by(*field):查询按照指定字段进行排序后的所有结果,返回值是一个list,类型为QuerySet,‘tag_name‘代表正序,‘-tag_name‘代表降序 User.objects.order_by(‘id‘) #按照id正序排序 User.objects.order_by(‘-id‘) #按照id降序排序 6. reverse():反转排序查询的所有结果,返回值为一个list User.objects.order_by(‘id‘).reverse() 7. count():统计返回查询结果list的长度 count = User.objects.all().count() 8. first():返回查询结果中的第一个对象obj 9. last():返回查询结果中的最后一个对象obj 10. exists():判断查询结果是否存在,值为布尔类型 res = User.objects.filter(id=6).exists() print(res) 11. values(*field):按照指定字段(们)进行查询,返回存放包含字段(们)的字典类型的列表list u_l5_dic = User.objects.values(‘id‘,‘name‘) print(u_l5_dic) 结果:<QuerySet [{‘id‘: 1, ‘name‘: ‘henry‘}, {‘id‘: 2, ‘name‘: ‘wendy‘}> 12. values_list(*field):与values(*field)类似,但返回值是存放数据的元组类型的列表list u_l6 = User.objects.values_list(‘id‘,‘name‘) print(u_l6) 结果:<QuerySet [(1, ‘henry‘), (2, ‘wendy‘)]> 13. distinct():从查询结果中剔除重复字段(一般和values结合使用),不能对数据库进行去重操作,只是在结果中剔除了重复的字段 u_17 = User.objects.values(‘name‘,‘age‘,‘birthday‘).distinct() print(u_17) ‘‘‘
‘‘‘ 配置ORM的loggers日志 print(user_list) #得到的sql语句是经过ORM框架优化后的sql语句,是真正交给pymysql执行的sql语句 print(user_list.query) #结果是将这个对象转化为sql语句的初步sql ‘‘‘
‘‘‘ user_list = User.objects.filter(id__gte=1) # 整型相关 age__exact=8 # 确切匹配8 age__in=[8, 10] # 8或10 age__gt=8 # 大于8 age__gte=8 # 大于等于8 age__lt=8 # 小于8 age__lte=8 # 小于等于8 age__range=[8, 10] # 8到10之间 age__isnull=0|1 u_111 = User.objects.filter(id__isnull=1) # 1:该字段为空的所有数据 | 0:该字段不为空的所有数据 # 字符串相关 name__startswith # 后方模糊匹配 u_l12 = User.objects.filter(name__startswith=‘s‘) print(u_l12) name__endswith # 前方模糊匹配 u_l13 = User.objects.filter(name__endswith=‘y‘) print(u_l13) name__contains # 前后方均模糊匹配 u_l14 = User.objects.filter(name__contains=‘n‘) print(u_l14) name__regex # 正则匹配 u_l15 = User.objects.filter(name__regex="n{1,}") #名字中含有一个或多个n print(u_l15) 在这里正则匹配不能用w代表所有字母数字,这样会被解析成是否含有w这个字符,而是要用[a-zA-Z0-9]代替 u_l16 = User.objects.filter(name__iregex="[a-zA-Z0-9]{1,}") #名字中含有一个或多个字符 print(u_l16) name__istartswith # 不区分大小写后方模糊匹配(i开头就是不区分大小写) u_l17 = User.objects.filter(name__istartswith=‘s‘) print(u_l17) # 时间相关 birthday__year=2008 # 时间年份模糊匹配 u_l18 = User.objects.filter(birthday__year=1989) print(u_l18) ‘‘‘
‘‘‘ from django.db.models import F, Q # F基于计算 F(‘字段名‘) # 案例一:将id为1的结果年龄增加1 User.objects.filter(id=1).update(age=F(‘age‘)+1) #age=age+1 是错误的,update不能完成二步操作 # 案例二:查询id是年龄1/4的结果 user = User.objects.filter(id=F(‘age‘)/6) #>> 与 << print(8>>1) => 4 print(8<<1) => 16 # Q基于关系 Q(‘字段条件‘) u_l19 = User.objects.filter(name__regex=‘henry‘,age=30) #默认是与关系 & print(u_l19) # 与 & User.objects.filter(Q(id=1) & Q(age=30)) # id=1 并且 age=30 # 或 | User.objects.filter(Q(id=1) | Q(id=2)) # id=1 或 id=2 User.objects.filter(Q(age__lt=20) | Q(name__icontains=‘a‘)) #年龄小于20或姓名包含a # 非 ~ User.objects.filter(~Q(id=1)) # id 不为 1 User.objects.filter(~Q(age__lte=25)) #年龄不小于等于25 ‘‘‘
以上是关于单表查询的主要内容,如果未能解决你的问题,请参考以下文章