Django-模型基础2

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语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值