10常用查询及表关系的实现
1.常用的模型字段类型
项目app中models.py中的自定义的类对应数据库中的一张表,该类继承于django.db.models.Model超类,常用的字段类也在models模块中,常见的有
- MySql===>Django
- int ------>IntegerField
- varchar ------> CharField
- longtext ------> TextField
- date ------> DateField
- datetime ------> DateTimeField
2.Field的常用参数
bool:primary_key,unique,null,default,blank,
DateField.auto_now,DateField.auto_now_add
- id = models.IntegerField()
参数:primary_key=True,auto_created =True - name = models.CharField()
参数:max_length=20 (必须有的参数)
3.常用的查询
通过模型类上的管理器(class.objects)来创建QuerySet(查询集)
QuerySet 标识数据库中对象的集合,等同于select语句,是惰性的,
案例:
stus = Student.objects.all()
#获取所有记录,返回的是queryset
print(stus.query)
SELECT `teacher_student`.`id`, `teacher_student`.`name`,
`teacher_student`.`age`, `teacher_student`.`sex`, `teacher_student`.`qq`,
`teacher_student`.`phone`, `teacher_student`.`c_time` FROM
`teacher_student`
- all() 返回所有记录,返回的是queryset
- first() 获取第一条记录(默认按照ID(主键)),返回的是一个对象
- last() 获取最后一条记录,返回的是一个对象
- get(**kwargs) 根据给定条件,获取一个对象,多个对象符合会报错
- filter(**kwargs) 根据给定条件(and),返回queryset
- exclude(**kwargs) 排除符合给定条件(and),返回queryset
- count() 过滤后返回数据库对象的个数
- distinct() 查询集去重
or条件符合的查询
需要使用models模块中的Q对象
from django.db.models import Q
Student.objects.filter(Q(age=0)|Q(age=1))
- values(*fields) 返回queryset,返回字典列表,而不是数据对象
res = Student.objects.values('name')
res
<QuerySet [{'name': 'xxl'}, {'name': 'alfonso'}, {'name': 'savage'}, {'name': 'mike'}, {'name': 'John'}, {'name': 'Blank'}]>
- only(*fileds) 返回queryset,返回对象列表,并且一定包含主键
- defer(*fields) 返回queryset,和only作用相反,排除字段
- order_by(*fields) 根据字段排序返回queryset,字段名前+’-'反序
往往不会获取表中所有数据,需要通过切片获取部分数据 - method()[limit:offset]
和python的列表切片用法相似,不建议使用步长,不支持负索引,切片之后不能再用方法过滤于排序
常用查询条件 filter/get
- Student.objects.filter(id__exact=14)
相当于id=14 - Student.objects.filter(name__iexact=’ ')
模糊查询,不区分大小写 - field__contains
包含参数值的 - field__icontains
不包含参数值的 - field__in = [ ]
查询等于列表中给定部分元素的 - field__range = (min,max)
查询在min与max范围内的 - field__gt = num,field__lt
大于,小于num的 - field__gte = num,field__lte
大于等于,小于等于num的 - field__startswith = ‘ch’,istartswith = ‘ch’
以ch开头的,i开头大小写不敏感 - field__endwith = ‘ch’, iendwith= ‘ch’
以ch末尾的 - field__isnull = True/False
对应SQL中的 IS NULL / IS NOT NULL
聚合
- count() 记录个数
from django.db.models import Avg,Max,Min,Sum
#计算平均年龄
Student.objects.aggregate(age_avg=Avg('age'))
#计算最大年龄
Student.objects.aggregate(age_max=Max('age'))
#计算最小年龄
Student.objects.aggregate(age_min=Min('age'))
#计算年龄之和
Student.objects.aggregate(age_sum=Sum('age'))
分组
结合 values,annotate 和聚合方法一起实现
from django.db.models import Count
res = Student.objects.values('sex').annotate(num=Count('sex'))
Student.objects.values('sex').annotate(Count('sex'))
print(res.query)#查看对应的sql语句