上篇博客主要讲了django中对数据库的增删改查,下面深入再讲解下对数据库的操作。

常用的查询方法

下面以表名为User为例

  • User.object.first() :返回表中第一条数据
  • User.object.last():返回表中的最后一条数据
  • User.object.get():指定条件,返回满足条件的唯一一条数据

first、last、get方法得到的都是一条数据,返回的是一个模型对象。

  • User.object.filter():指定条件,过滤掉不满足条件的。
  • User.object.exclude():指定条件,过滤掉满足条件的,与filter方法正好相反。
  • User.object.all():返回表中所有数据,可加入参数,指定返回的字段。
  • User.object.order_by():加入字段名为参数,可加入多个字段名,默认是正向排序,在字段名前加上负号表示逆向排序。
  • User.object.reverse():对排序结果进行反转
  • User.object.distint():对结果去重,常配合value方法使用。
  • User.object.all().values():将all返回的QuerySet的moodel转为字典。

下面是all方法和value方法得到的,下面看看其和转成字典的对比。

以上这些方法返回的是QuerySet对象。

  • User.object.exists():判断查询的数据是否存在

返回的是bool类型

  • User.object.count():返回当前查询到的数据总数

返回的int类型

QuerySet对象支持索引和切片,映射于sql的limit。

常用查询条件

查询条件常用于filter方法。语法规则为:User.object.filter(字段名__条件关键词 = 条件值),下面对这个条件关键词加以总结。

  • exact,相当于等于,iexact也是等于,不同的是他是忽略大小写的。
  • gt,相当于大于号。
  • gte,相当于大于等于号。
  • lt,相当于小于号。
  • lte,相当于小于等于号。
  • contains,包含关系,指的是字段值是否包含指定的字符或数字。icontains也是忽略大小写的。
  • startwith,判断是否以指定值开头。istartswith忽略大小写。
  • endwith,判断是否以指定值结尾。iendswith忽略大小写。
  • in,成员所属关系。
  • range,判断是否在指定的范围中,范围是左闭右闭的。
  • isnull,判断是否为空,值为True或False。

常用字段类型

  • IntegerField,映射于数据库的整型int。
  • CharField,单行字符串字段类型,必填参数是max_length,映射于数据库的varchar。
  • TextField,多行文本字段,映射于数据库的longtext。
  • FloatField、DecimalField,二者都是存放小数的类型,映射于数据库的float、decimal。
  • DateField、DateTimeField,一个是日期类型,另一个是日期时间类型,映射于数据库的date和datetime。
  • BooleanField,bool类型,映射于数据库的tinyint。
  • AutoField,是一个自增长的int类型。
  • OneToOneField,一对一关系的关联。
  • ForeignKey,一对多的关系关联。
  • ManyToManyField,多对多的关系关联。

以下是相对不是很常用的字段类型

  • EmailField,电子邮件
  • URLField,用于存放url地址
  • BinaryField,存放原始二进制的字段,映射于数据库的binary。
  • FileField,上传文件的字段。
  • ImageField,是FileField的子类,用于图片存放的字段。

Field的常用参数

  • primary_key:指定是否为主键。
  • unique:指定是否唯一。
  • null:指定是否为空,默认是False。
  • unique_for_date:指定日期唯一。
  • blank:等于True时,表单form验证可以为空,默认是False。
  • DateField.auto_now:每次修改都将更新时间进去,但只有Model.save()方法才能调用这个,QuerySet.update()方法不会调用。
  • DateField.auto_now_add:第一次创建这个字段时将此时时间添加进去,以后不会修改这个值。

下面实现一个表关系的例子,有四张表,分别是一对一的学生表和学生详细表,一对多的学生表和学院表,多对多的学生表和课程表。

下图是对四张表的创建模板类

创建完模板类保存上传后再执行python manage.py makemigrations和python manage.py migrate两条命令来将模板类写进数据库中。



下面分别看看五张表的结构,为什么是五张表呢?不是四张吗?

我们知道的是,两张表的多对多关系需要一张第三张表来关联,而django会为我们自动创建这么一张表。

下面这张表就是django为我们自动创建的第三张表。他将student_id和course_id分别于学生表和课程表相关联。

Django模型基础——(二)的更多相关文章

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

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

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

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

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

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

  4. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  5. Django 07 Django模型基础2 (常用查询和多表关联)

    Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...

  6. Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)

    Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...

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

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

  8. Django 学习第六天——Django模型基础第一节

    一.Django 的 ORM 简介: Django的ORM系统的分析: 1.ORM 概念:对象关系映射(Object Relational Mapping,简称ORM) 2.ORM的优势:不用直接编写 ...

  9. 六、Django模型基础第一节

    1 数据库的连接配置 django 连接mysql的配置流程: 安装 pymysql pip install pymysql 创建数据库用户 '; grant all on *.* to 'xiang ...

  10. django模型系统二

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

随机推荐

  1. HDU - 1166 敌兵布阵 (线段树---点修改)

    题意: 1.Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30) 2.Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30); 3.Query i j ,i和j ...

  2. Codeforces 2A :winner

    A. Winner time limit per test 1 second memory limit per test 64 megabytes input standard input outpu ...

  3. Elasticsearch开启试用x-pack license

    一.Elasticsearch 6.7.2开启trial  x-pack license:x-pack的license试用期只有30天 1.ES6.7.2版本默认已经安装了x-pack插件,这里就没有 ...

  4. idea 将java 项目 打包成jar包

    记录一下,防止忘记.ps : 请忽略这个是web项目 1.idea 打包jar包 (1)首先打开Project Structure,选中Artifacts (2)点击绿色加号,选中jar ,然后选中f ...

  5. JPA#ManyToMany

    多对多,多个学生选了多个课程. 涉及到的注解(注解的使用看注释):ManyToManyJoinTableJsonIgnoreProperties @Entity @Table(name = " ...

  6. 九十八、SAP中ALV事件之十一,查看图片

    一.输入事务代码OAER 二.可以看到相关的图片文件了

  7. 三、JavaScript之隐藏HTML元素

    一.代码如下 二.点击前效果 三.点击后效果 <!DOCTYPE html> <html> <meta http-equiv="Content-Type&quo ...

  8. 【转】ASP.NET Core 2.0中的HttpContext

      ASP.NET Core 2.0中的HttpContext相较于ASP.NET Framework有一些变化,这边列出一些之间的区别.   在ASP.NET Framework中的 System. ...

  9. Elasticsearch 更新文档

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  10. super方法

    继承 __init__是python中的构造函数,用于属性的初始化. 如果在子类中定义了构造函数,python默认不会调用父类的构造函数,父类里的属性就不会集成到子类. super 用于调用父类(超类 ...