ORM(Object Relational Mapping )对象关系映射.
Django的Model就是ORM的一个具体实现
Model层:字段介绍
常用字段类型
数值型
- AutoField 自增主键 model默认提供id的类型,可以被重写
- BooleanField 布尔类型字段,一般用于记录状态标记
- DecimalField 精确数值,支付相关 金融相关
- IntegerField int型非递增
- SmallIntegerField 小整数时一般会用到
字符型
- CharField varchar类型
- URLField 继承自charfield 实现了对url的特殊处理
- FileField 对文件的特殊处理,会自动生成一个可上传文件的按钮
- TextFilde 大量文本内容
- ImageFild 用来处理图片相关的数据,在展示上会有不同
日期类型
- DateField date ‘YYYY-MM-DD’
- DateTimerField datetime 'YYYY-MM-DD HH:mm:ss
- TimerFilde time HH:mm:ss
参数
- null 用于设定在数据库中是否允许为空(null=True 则在数据库空的位置会生成null)
- blank 业务层上该值是否允许为空(blank=true 则在管理页面等表单数据保存时该字段可以为空)
- db_column 对应数据库字段的名称,如果不设置默认为该字段名
- default 默认值的配置
- primary_key 主键,一个model只能允许有一个primary_key
- help_tex 字段提示语,配置这一项后,在页面对应字段的下发会展示次配置
- unique 唯一约束 unique=true 则db_index不用设置
Model层:queryset使用
queryset
Django通过给model增加一个objects属性来提供数据操作的接口,操作后会拿到quryset对象,操作他就会对db中获取数据/修改
Queryset是懒加载的,不适用queryset对象式不会去执行可以通过链式调用,提供部分性
posts = Post.objects.filter(status=1).filter(category_id=2).filter(title__icontains="xxx")
这是一种良好的编程方式,对数据处理更加自然。类似于管道与水流的关系,数据就是水流,而管道就是方法,把不同的管道连接起来形成“链”,然后让数据流过。
queryset接口
支持链式调用的接口 即返回Queryset的接口
- all() 查询所有数据
- filter() 过滤数据,返回符合条件的
- exclude() 与filter相反的逻辑
- reverse() 把queryset中的结果倒序排列
- distinct() 进行去重查询
- none() 返回空的Queryset
- order_by(字段) 根据字段排序
不支持链式调用的接口
- get() 用于查询指定条件的数据get(id=1) 如果存在 则直接返回对应的实例;如果不存在则抛出 DoesNotExist异常
- crate() 创建一个Model对象
- get_or_create() 根据条件查找,没有查到,就调用create创建。返回值是一个元祖(对象, 是否是创建的)
- update_or_create 同上一个,用来做更新操作
- count() 用于返回Queryset有多少条记录
- latest() 用于返回最新的一条记录
- exists() 返回true or false判断queryset是否有数据(建议不要用count or len(queryset)
- delete() 用来根据条件批量删除记录
- values() 返回的结果包含dict的Queryset
- values_list() 直接返回的是包含tuple的Queryset
>>> Blog.objects.filter(name__startswith='Beatles')
<QuerySet [<Blog: Beatles Blog>]>
# This list contains a dictionary.
>>> Blog.objects.filter(name__startswith='Beatles').values()
<QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
>>> Blog.objects.values()
<QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
>>> Blog.objects.values('id', 'name')
<QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
>>> Entry.objects.values_list('id').order_by('id')
<QuerySet[(1,), (2,), (3,), ...]>
>>> Entry.objects.values_list('id', flat=True).order_by('id')
<QuerySet [1, 2, 3, ...]>
常用的字段查询
- 大于、大于等于:
xx为对应模型类中定义的字段名
XXX__gt 大于>
XX__gte 大于等于>=
Student.objects.filter(age__gt=10) // 查询年龄大于10岁的学生
Student.objects.filter(age__gte=10) // 查询年龄大于等于10岁的学生
- 小于、小于等于:
XX__lt 小于<
XX__lte 小于等于<=
Student.objects.filter(age__lt=10) // 查询年龄小于10岁的学生
Student.objects.filter(age__lte=10) // 查询年龄小于等于10岁的学
- like:
XX__exact 精确等于 like 'aaa'
XX__iexact 精确等于 忽略大小写 ilike 'aaa'
XX__contains 包含 like '%aaa%'
XX__icontains 包含,忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
- in:
XX__in
查询年龄在某一范围的学生
Student.objects.filter(age__in=[10, 20, 30])
- 不等于/不包含于:
__isnull 判空
Student.objects.filter(name__isnull=True) // 查询用户名为空的学生
Student.objects.filter(name__isnull=False) // 查询用户名不为空的学生
- 其他常用模糊查询:
XX__startswith 以…开头
XX__istartswith 以…开头 忽略大小写
XX__endswith 以…结尾
XX__iendswith 以…结尾,忽略大小写
XX__range 在…范围内
XX__year 日期字段的年份
XX__month 日期字段的月份
XX__day 日期字段的日
7.多表连接查询
class A(models.Model):
name = models.CharField(u'名称')
class B(models.Model):
aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')#查询B表中外键aa所对应的表中字段name包含searchtitle的B表对象。
进阶查询
- F
用来执行数据库层面的计算,避免出现竞争的状态.
它会覆盖标准的Python运算符来创建一个封装的SQL表达式;
优点
1.直接在数据库中操作而不是python
2.减少一些操作所需的数据库查询次数
from django.db.models import F
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_field = F('stories_field') + 1
reporter.save()
F()可以通过updage()方法被用在QuerySets对象实例中。这样可以省略上面用到的两个查询--get()和save():
reporter = Reporters.objects.filter(name='Tintin')
reporter.update(stories_field=F('stories_field') + 1)
- Q
用于查询时条件之间的逻辑关系。not and or,可以对Q对象进行&|~操作。
使用之前需要先导入:
from django.db.models import Q
例:查询id大于3且阅读量大于30的图书的信息。
BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
例:查询id大于3或者阅读量大于30的图书的信息。
BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
例:查询id不等于3图书的信息。
BookInfo.objects.filter(~Q(id=3))
- 聚合函数
对查询结果进行聚合操作
sum count avg max min
aggregate:调用这个函数来使用聚合。 返回值是一个字典
使用前需先导入聚合类:
from django.db.models import Sum,Count,Max,Min,Avg
例:查询所有图书的数目。
BookInfo.objects.all().aggregate(Count('id'))
{'id__count': 5}
例:查询所有图书阅读量的总和。
BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}
count函数 返回值是一个数字
作用:统计满足条件数据的数目。
例:统计所有图书的数目。
BookInfo.objects.all().count()
BookInfo.objects.count()
例:统计id大于3的所有图书的数目。
BookInfo.objects.filter(id__gt=3).count()