Django中操作操作数据库这里需要改一个数据:

模型层:就是与跟数据库打交道    

ORM查询:

     一、单表操作必知必会13条:

      orm默认都是惰性查询:
      1.all() 查询所有


      2.filter() 筛选条件 条件之间是and关系 条件不存在不报错


      3.get() 直接返回数据对象本身 条件不存在直接报错 不推荐使用


      4.first() 取queryset中第一个元素对象


      5.last() 取queryset中最后一个元素对象


      6.count() 计数


      7.values() 根据指定的字段 获取指定的值 列表套字典


      8.values_list() 根据指定的字段 获取指定的值 列表套元祖


      9.order_by() 按照指定字段排序 默认是升序 在字段前面加一个负号就是降序


      10.reverse() 反转 前提是前面的数据必须是有序的(排序)


      11.exclude() 排除什么什么在外


      12.exists() 判断结果是否有值 返回的是布尔值类型


      13.distinct() 去重 数据必须是一模一样的 主键也包含在内

 二、神奇的双下划綫查询:

  1.__gt 大于:

  2.__lt 小于

  3.__gte


  4.__lte


  5.__in


  6.__range


  7.__startswith


  8.__endswith


  9.__contains 默认是区分大小写的


  10.__icontains 忽略大小写


  11.__year


  12.__month

 三、外键字段的增删改查一对多字段:

  增

  改:

 四、多对多字段的增删改查:

  增方法

  操作多对多的时候先查找到关联的表,然后进行点关联字段跨到第三张表,具体操作看下面图片:

由上面的代码我们可以发现,add方法能朝第三张表关系添加数据的时候,即支持传数字add(1,2),同时也支持传对象add(author_obj,author_obj1),并且两者都之处传多个。

  改方法

  多对多表操作的改方法,是有的set方法。这里我们需要特别注意的地方时,我们给set传值得时候必须是一个可迭代对象,同时他也可以传数字和传对象的,同时也之处穿多个。

  删方法

多对多表操作的删方法,是用的remove方法。既可以传数字也可以传对象,并且也支持传多个,不需要传可迭代对象,详情看下下面的代码:

  清空clear 删除某个数据在第三张表中的所有数据,括号内不需要传递参数

  查方法

  查的时候分为正向查询和反向查询,

  正向查询是,关键字在哪个表,由哪个表开始发起查找就是正向查找,反之就是反向查找。

  正向查询方法是,按照字段查找;反向查询是按表名小写加_set。

 正向查询:

从上面的代码中我们看到有的地方加了all()。什么时候需要加all呢!当正向查询点击外键字段数据有多个的情况下,只需要.all()。当你看到APP01.Author.None,一旦你看到报这样的关键字,只需要加.all()即可。

注意:在写ORM的时候要跟写sql语句一样,不要想一次性全部写完,可以写一点查一点再写一点,循序渐进的写,把复杂的语句分层去写。

 反向查询:

注意:一对多和多对多的反向查询的时候是表名小写加_set,但是一对一的时候就不需要加_set了。

 基于双下划线的跨表查询,(联表操作),下面我们看下几个例子(重点)

 五、ORM查询优化

  数据库查询优化相关:

  1.only与defer

  2.select_related与prefetch_related

  select_related括号内只能放外键字段 并且外键字段的类型只能是一对多 或者 一对一 不能是多对多,内部是自动连表操作 会将括号内外键字段所关联的表 与当前表自动拼接成一张表,然后将表中的数据一个个查询出来封装成一个个的对象,这样做的好处就在于跨表也不需要重复的走数据库了 减轻数据库的压力,select_related括号内可以放多个外键字段 都号隔开 会将多个外键字段关联的表与当前表全部拼成一张大表,

注意:耗时: 数据库层面需要先连表 。

  prefetch_related内部是子查询会自动帮你按步骤查询多张表 然后将查询的结果封装到对象中给用户的感觉好像还是连表操作括号内支持传多个外键字段 并且没有类型限制特点:每放一个外键字段 就会多走一条sql语句 多查询一张表

注意:耗时:查询的次数长

两者之间的优缺点结合实际情况 表的大小两张表都特别大的情况下 连表操作 可能耗时更多。

 六、choices

   choices参数

    用在一些字段数据是可以明确列出所有可能的,例如:性别、工作经验、学历等等。

    1.先提前定义好对应关系

    2.再通过字段的choices参数来指定关系

      eg:

        dender_choices=(

          (1,'male'),

          (2,'female')

          (3,'other')

        )

    gender = models.IntergerField(choices = gender_choices),将choices字段写入数据库

    但是一旦你存储的数据在你实现定义好得范围内。就可以利用get_字段_display()拿到对应的解释信息

七、什么是事务,MySQL如何支持事务:

什么是事务?

事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。(说白了就是几步的数据库操作而构成的逻辑执行单元

事务具有四个特性原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性也简称ACID性。

(1)原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,具有不可再分的特征一样。事务是应用中不可再分的最小逻辑执行体。(最小了,不可再分了

(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(说罢了就是白狗变成了黑狗,不能出现斑点狗!

(3)隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。(说白了,就是你做你的,我做我的!

(4)持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。(说白了就是一条道跑到黑

MySQL如何支持事务?

MYSQL的事务处理主要有两种方法

  1.用begin,rollback,commit来实现
    begin开始一个事务
    rollback事务回滚
       commit 事务确认
  2.直接用set来改变mysql的自动提交模式
          mysql默认是自动提交的,也就是你提交一个query,就直接执行!可以通过
          set autocommit = 0 禁止自动提交
          set autocommit = 1 开启自动提交
       来实现事务的处理

八、简述数据库三大范式:

第一范式(1NF):原子性 字段不可再分,否则就不是关系数据库;

第二范式(2NF):唯一性 一个表只说明一个事物;

第三范式(3NF):每列都与主键有直接关系,不存在传递依赖;

PS:第二范式要遵循第一范式,第三范式要遵循第二范式。

简单来说:

1NF:列表字段不可分;

2NF:有主键且非主键依赖主键;

3NF:非主键字段不能相互依赖;

不符合第一范式的例子(关系数据库中create不出这样的表):

表:姓名,性别,电话

问题:若某个人有两个电话,家庭电话和手机,这样则不符合第一范式。

解决:把电话列分成两个列即可。

不符合第二范式的例子:

表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;

这个表明显说明了两个事务:学生信息, 课程信息,不符合第二范式。

存在问题:数据冗余,每条记录都含有相同信息。

解决:分成学生表和课程表分别存储即可。

不符合第三范式的例子:

学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号";

存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话)

存在问题:

数据冗余:有重复值;

解决:分成学生表,学院表即可。

Django-ORM和MySQL事务及三大范式介绍的更多相关文章

  1. Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置

    数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...

  2. MySQL数据库的三大范式定义,作用—------你所期待的最佳答案

    第一范式:确保每列的原子性. 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名.编号.地址.……)其中"地址"列还可 ...

  3. django----中使用事务 数据库的三大范式

    目录 orm中的事务操作 ⑴ 原子性(Atomicity) ⑵ 一致性(Consistency) ⑶ 隔离性(Isolation) ⑷ 持久性(Durability) django中使用事务 数据库三 ...

  4. Django ORM 数据库操作

    比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 ...

  5. MySQL 事务常见面试题总结 | JavaGuide 审核中

    <Java 面试指北>来啦!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计.常见框架.分布式.高并发 ......).优质面经等内容. 本文原发于 MySQL知识点&am ...

  6. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  7. MySQL(三)之SQL语句分类、基本操作、三大范式

    一.SQL语句的分类     DML(Data Manipulation Langauge,数据操纵/管理语言) (insert,delete,update,select)     DDL(Data ...

  8. MySql三大范式与数据库设计和表创建常用语句

    [数据库设计的三大范式] 1.第一范式(1NF First Normal Fromate):数据表中的每一列(字段),必须是不可拆分的最小单元.也就是确保每一列的原子性. 例如: userInfo: ...

  9. django中使用mysql数据库的事务

    django中怎么使用mysql数据库的事务   Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起 ...

随机推荐

  1. python基础(代码规范、命名规范、代码缩进、注释)

    代码规范 PEP8(python增强建议书第8版) 每个import语句只导入一个模块 不要在行尾添加分号";" 建议每行不超过80个字符   超出部分可以用()来进行换行例如: ...

  2. 【MM系列】SAP技巧之更改布局

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP技巧之更改布局   前言部分 ...

  3. 【DSP开发】C6678的中断控制器

    分两层,一层是每个core内部的中断控制器,这个叫interrupt controller,简写intc:一层是整个芯片的,属于芯片级的,在每个core的外面,这个叫chip-level interr ...

  4. HP UNIX弱口令

    这种弱口令直接丢进kali linu里用john --wordlist=zd.txt 加上文件

  5. Ajax异步上传在SSM框架中的应用

    最近在做毕业设计,由于毕设中要实现图片上传和视频上传的功能.突然发现原来的Form表单中的file已经满足不了我了,于是在一番折腾之后终于让我找到了一个简便的上传方式.下面来和大家分享一下我的过程. ...

  6. spring简单crud配置文件说明

    字体设置:代码  14px 文字 幼圆 15px 1.在pom.xml下导入依赖包 (1)Spring四个核心依赖包 <dependency> <groupId>org.spr ...

  7. 版本控制器之SVN(一)

    通常软件开发由多人协作开发,如果对代码文件.配置文件.文档等没有进行版本控制,将会出现很多问题: 备份多个版本,占用磁盘空间大 解决代码冲突困难 容易引发BUG 难于追溯问题代码的修改人和修改时间 难 ...

  8. vue-router和webpack懒加载,页面性能优化篇

    在vue单页应用中,当项目不断完善丰富时,即使使用webpack打包,文件依然是非常大的,影响页面的加载.如果我们能把不同路由对应的组件分割成不同的代码块,当路由被访问时才加载对应的组件(也就是按需加 ...

  9. centos配置postfix邮件服务

    1.环境初始化 [root@mail ~]# rpm -q centos-release //查看系统版本 centos-release-7-5.1804.el7.centos.x86_64 [roo ...

  10. 图片哈希概论及python中如何实现对比两张相似的图片

    Google 以图搜图的原理,其中的获取图片 hash 值的方法就是 AHash. 每张图片都可以通过某种算法得到一个 hash 值,称为图片指纹,两张指纹相近的图片可以认为是相似图片. 以图搜图的原 ...