Model层基础知识

ORM(Object Relational Mapping )对象关系映射.

Django的Model就是ORM的一个具体实现

Model层:字段介绍

常用字段类型

数值型

  1. AutoField 自增主键 model默认提供id的类型,可以被重写
  2. BooleanField 布尔类型字段,一般用于记录状态标记
  3. DecimalField 精确数值,支付相关 金融相关
  4. IntegerField int型非递增
  5. SmallIntegerField 小整数时一般会用到

字符型

  1. CharField varchar类型
  2. URLField 继承自charfield 实现了对url的特殊处理
  3. FileField 对文件的特殊处理,会自动生成一个可上传文件的按钮
  4. TextFilde 大量文本内容
  5. ImageFild 用来处理图片相关的数据,在展示上会有不同

日期类型

  1. DateField date ‘YYYY-MM-DD’
  2. DateTimerField datetime 'YYYY-MM-DD HH:mm:ss
  3. TimerFilde time HH:mm:ss

参数

  1. null 用于设定在数据库中是否允许为空(null=True 则在数据库空的位置会生成null)
  2. blank 业务层上该值是否允许为空(blank=true 则在管理页面等表单数据保存时该字段可以为空)
  3. db_column 对应数据库字段的名称,如果不设置默认为该字段名
  4. default 默认值的配置
  5. primary_key 主键,一个model只能允许有一个primary_key
  6. help_tex 字段提示语,配置这一项后,在页面对应字段的下发会展示次配置
  7. 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的接口

  1. all() 查询所有数据
  2. filter() 过滤数据,返回符合条件的
  3. exclude() 与filter相反的逻辑
  4. reverse() 把queryset中的结果倒序排列
  5. distinct() 进行去重查询
  6. none() 返回空的Queryset
  7. order_by(字段) 根据字段排序

不支持链式调用的接口

  1. get() 用于查询指定条件的数据get(id=1) 如果存在 则直接返回对应的实例;如果不存在则抛出 DoesNotExist异常
  2. crate() 创建一个Model对象
  3. get_or_create() 根据条件查找,没有查到,就调用create创建。返回值是一个元祖(对象, 是否是创建的)
  4. update_or_create 同上一个,用来做更新操作
  5. count() 用于返回Queryset有多少条记录
  6. latest() 用于返回最新的一条记录
  7. exists() 返回true or false判断queryset是否有数据(建议不要用count or len(queryset)
  8. delete() 用来根据条件批量删除记录
  9. values() 返回的结果包含dict的Queryset
  10. 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, ...]>

常用的字段查询

  1. 大于、大于等于:
xx为对应模型类中定义的字段名
XXX__gt  大于>        
XX__gte  大于等于>=
 
Student.objects.filter(age__gt=10)    // 查询年龄大于10岁的学生
Student.objects.filter(age__gte=10)  // 查询年龄大于等于10岁的学生
  1. 小于、小于等于:
XX__lt  小于<
XX__lte 小于等于<=
 
Student.objects.filter(age__lt=10)     // 查询年龄小于10岁的学生
Student.objects.filter(age__lte=10)   // 查询年龄小于等于10岁的学
  1. like:
XX__exact        精确等于       like 'aaa'
XX__iexact       精确等于       忽略大小写 ilike 'aaa'
XX__contains     包含           like '%aaa%'
XX__icontains    包含,忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
  1. in:
XX__in
 
查询年龄在某一范围的学生
Student.objects.filter(age__in=[10, 20, 30])
  1. 不等于/不包含于:
__isnull  判空
 
Student.objects.filter(name__isnull=True)    // 查询用户名为空的学生
Student.objects.filter(name__isnull=False)  // 查询用户名不为空的学生
  1. 其他常用模糊查询:
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表对象。

进阶查询

  1. 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)
  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))
  1. 聚合函数

对查询结果进行聚合操作

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()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值