django模型系统(二)

常用查询

  • 每一个django模型类,都有一个默认的管理器,objects

QuerySet表示数据库中对象的列表。他可以有0到国歌过滤器。过滤器通过给定参数,缩小查询范围(filter)。

QuerySet等同与select语句,过滤器等同于一个限制字句,比如where、limit

  • 使用.query可查看对应的SQL语句
  1. all()获取所有

    name.objects.all()queryset
  2. 获取第一条

    name.objects.first()返回的是对象
  3. 获取最后一条

    name.objects.last()返回的是对象
  4. get(**kwargs)根据给定的条件获取一个对象,如果符合多个或者没有就会报错
  5. filter(**kwargs)过滤,根据参数提供的条件,获取一个过滤器后的QuerySet,多个条件等同于select子句使用and连接,关键字参数的形参必须是模型中的字段名。
Student.objects.filter(name='xinlan').filter(age=18)
  1. exclude(**kwargs), 用法和filter一样,作用相反,它是排除
  2. order_by(*fields),根据给定的字段排序。多个的时候有先后顺序。
Student.objects.order_by('-age', 'name').query)
# 默认asc,-age 代表反向排序
  1. 切片 使用列表的切片语法操作query,除了不能用负索引,其他的都可以,它等价于LIMIT与OFFSET子句。[::]
  2. values(*fields)返回queryset, 这个queryset返回的是一个字典列表。参数fields指定了select中我们想要限制查询的字段。返回的字典列表中,只会包含我们指定的字段。如果不指定,包含所有字段。
  3. only(*fields)返回一个queryset,跟values一样,区别在于这个queryset是对象列表,only一定包含主键。
  4. defer(*fields) 用法与only相反
  5. 多条件OR连接,需要实现OR条件,我们要使用Q对象。
    • 注意:要导入模块from django.db.models import Q
from django.db.models import Q
res = Student.objects.filter(Q(age=18)|Q(age=19)).only('name')
# 等价于下面的sql
SELECT `teacher_student`.`id`, `teacher_student`.`name` FROM `teacher_student` WHERE (`teacher_student`.`age` = 18 OR `teacher_student`.`age` = 19)

查询条件

  • exact 精确匹配

    例如:Student.objects.filter(name__exact='XXX')#_exact可以不写
  • iexact 忽略大小写
  • contains 包含,对应sql的%
  • icontains 包含(忽略大小写)
  • in 等价sql的in
  • gt 大于:grate than
  • gte 大于等于:grate than equ
  • lt 小于:less than
  • lte 小于等于:less than equ
  • startswith 以什么什么开始
  • istartswith 忽略大小写
  • endwith 以什么什么结束
  • iendwith 忽略大小写
  • range **__range=(),范围区间,等价于sql:between...and...
  • isnull 是否为空

语法都是field__conditon= 是 两个下划线

count() ,统计。返回queryset的长度

聚合函数

语法:

list_name.objects.aggregate(anyname=Avg('age'))
#必须要用aggregate方法,anyname自己命名
#返回的市dit字典,不是query语句,无法查询sql语句
  • Avg 平均值
# 计算同学们的年龄平均值
res = Student.objects.aggregate(age_avg=Avg('age'))
  • Max 最大值
    # 找到最大的年龄
res = Student.objects.aggregate(age_max=Max('age'))
  • Min 最小值
  • Sum求和
  • 分组,聚合,分组需要结合values,annotate和聚合方法看下面的案例
  # 查询男生女生分别有多少人
In [84]: from django.db.models import Count
#必须要导入模块
In [85]: res = Student.objects.values('sex').annotate(Count('sex'))

常用模型字段类型

官方文档说明:

https://docs.djangoproject.com/en/2.1/ref/models/fields/#field-types

表关系实现

django 中,模型通过特殊的字段进行关系连接

  • 一对一
  • 一对多
  • 多对多

例如:

anyname = models.OneToOneField('class_name',on_delete=models.CASCADE)#on_delete级联等外键关系

注意事项:

  • 多对多关系,如果第三方表还有额外得到属性,需要手动创建第三方表并加入额外属性。并且要使用through属性指定第三张表。

    例如:

    class A(models.Model):
    pass class B(models.Model):
    anyname = models.ManyToManyField('A',through='C')
    #B和A表多对多关联,手动生成第三方表,通过through指定第三方表C,在表C中可以添加额外属性 class C(models,Model):
    pass

django模型系统(二)的更多相关文章

  1. django模型系统二

    常用查询及表关系的实现 1.常用查询 每一个django模型类,都有一个默认的管理器 objects QuerySet表示数据库中对象的列表,它可以有0到多个过滤器.过滤器通过给定参数,缩小查询范围. ...

  2. python的Web框架,Django模型系统二,模型属性,及数据库进阶查询

    原始数据接上篇文章来操作.可能需要查看后才能懂.点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fie ...

  3. django模型系统(一)

    django模型系统(一) djangode ORM ORM:对像关系映射 用python概念去表达数据库 数据库配置(mysql) 安装pumysql 修改项目目录下的__init__.py imp ...

  4. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  5. day 70 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  6. day 56 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  7. 八.django模型系统(二)之常用查询及表关系的实现

    Ⅰ.常用查询  1.几个概念 每一个django模型类,都有一个默认的管理器,objects,查询就是依赖于objects管理器进行的(在创建时就被添加了). QuerySet表示数据库中对象的列表( ...

  8. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

  9. Django模型系统——ORM校园管理系统代码

    1.models.py from django.db import models # Create your models here. class Class(models.Model): id = ...

随机推荐

  1. 2018-2019-2 20165335 《网络对抗技术》 Exp6 信息搜集与漏洞扫描

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...

  2. go 语言

    go语言(或 Golang)是Google在 2007 年开发的一种开源编程语言,于2009年11月开源,2012年发布go稳定版 go是非常年轻的一门语言,它的主要目标是“兼具Python 等动态语 ...

  3. 同事问如何判断同花顺,我用javascript的二维数组写了个简易demo

    有个前同事在群里问如何判断是否为同花顺我用javascript的二维数组写了个简易demo. <!DOCTYPE html> <html> <body> <s ...

  4. python基础部分----文件、copy、内存指针

    0.来源:https://www.cnblogs.com/jin-xin/articles/9439483.html 1.is VS id() VS == 2.小数据池.代码块缓存机制 3.赋值符号= ...

  5. 升级python2.7, 实现python2.7与python3并存

    由于用到twilio模块, 所以需要升级一下python2, 但是又不想舍弃python2, 于是实现了简单的方法 python 先扔一块依赖 yum install zlib-devel bzip2 ...

  6. xftp5和xshell的使用

    目的:实现windows和linux系统之间文件的传输 步骤:1)下载xshell5 百度搜索即可,直接下载安装 2)xshell5下载完成后与虚拟机链接成功 3)下载xftp5点击 然后跟据官方的指 ...

  7. 浅谈Vue之双向绑定

    VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的.那么Object.defineP ...

  8. 论文笔记:Learning Attribute-Specific Representations for Visual Tracking

    Learning Attribute-Specific Representations for Visual Tracking AAAI-2019 Paper:http://faculty.ucmer ...

  9. 一键快速部署CodeBlocks的EGE图形库工具

    大一下学期,学完了c语言的基本内容, 也就开始开发项目了,此时一个图形界面就比较重要了,c语言中不提供图形界面,一般这些是用的其它开发的图形库,如 Easyx .ege等. 本文就提供 Codeblo ...

  10. swift 有道 翻译文档(1 定义变量常量,数组字典)

    使用let来创建常量,使用var来创建变量.一个常量的值在编译时不需要知道,但是您必须为它指定一个值一次.这意味着您可以使用常量来命名一个您确定一次的值,但是在许多地方使用它.var myVariab ...