# Models 模型
- ORM
  - ObjectRelationMap : 把面向对象思想转换成关系数据库思想.操作上把类等价于表格
  - 类对应表格
  - 类中的属性对应表中的字段
  - 在应用中的models.py文件中定义class
  - 所有需要使用ORM的class都必须是 models.Model 的子类
  - class中的所有属性对应表格中的字段
  - 字段的类型都必须使用 modles.xxx 不能使用python中的类型
  - 在django种,Models负责跟数据库交互

- django链接数据库
  - 自带默认数据库Sqllite3
    - 关系型数据库
    - 轻量级
  - 建议开发用sqlite3, 部署用mysql之类数据库

    - 切换数据库在settings中进行设置

    # django 连接 mysql
    DATABASES = [
      'default' = {
      'ENGINE' : 'django.db.backends.mysql',
      'NAME' : '数据库名',
      'PASSWORD': '数据库密码',
      'HOST': '127.0.0.1',
      'PORT': '3306',
      }
    ]
  - 需要在项目文件下的__init__文件中导入pymysql包

  ```
  # 在主项目的__init__文件中

  import pymysql
  pymysql.install_as_MySQLdb()
  ```

# models类的使用
- 定义和数据库表映射的类
  - 在应用中的models.py文件中定义class
  - 所有需要使用ORM的class都必须是 models.Model 的子类
  - class中的所有属性对应表格中的字段
  - 字段的类型都必须使用 modles.xxx 不能使用python中的类型
- 字段常用参数
  1. max_length : 规定数值的最大长度
  2. blank : 是否允许字段为空,默认不允许
  3. null : 在DB中控制是否保存为null, 默认为false
  4. default : 默认值
  5. unique : 唯一
  6. verbose_name : 假名

- 数据库的迁移
  1. 在命令行中,生成数据迁移的语句(生成sql语句)

  ```
  python3 manage.py makemigrations
  ```

  2. 在命令行中,输入数据迁移的指令

  ```
  python3 manage.py migrate
  ```

  ps : 如果迁移中出现没有变化或者报错,可以尝试强制迁移

  ```
  # 强制迁移命令
  python3 manage.py makemigrations 应用名
  python3 manage.py migrate 应用名
  ```
  3. 对于默认数据库, 为了避免出现混乱,如果数据库中没有数据,每次迁移前可以把系统
  自带的sqlite3数据库删除

# 1. 查看数据库中的数据

  ```
  1. 启动命令行 : python3 manage.py shell
  ps: 注意点: 对orm的操作分为静态函数和非静态函数两种.静态是指在内存中只有一份内容存在,调用的时候使用 类名. 的方式.如果修改了那么所有使用的人都会受影响.
  2. 在命令行中导入对应的映射类
  from 应用.models import 类名
  3. 使用 objects 属性操作数据库. objects 是 模型中实际和数据库进行交互的 Manager 类的实例化对象.
  4. 查询命令
  - 类名.objects.all() 查询数据库表中的所有内容. 返回的结果是一个QuerySet类型,实际上是类列表中装这个一个一个数据对象.
  - 类名.objects.filter(条件)
  ```

  ```
  # from 应用名.models import 类名
  from myapp.models import Student

  # 查询Student表中的所有数据,得到的是一个QuerySet类型
  Student.objects.all()

  # 如果要取出所有QuerySet类型中的所有数据对象,需要遍历取出所有的对象,再用对象.属性来查看值
  s = Student.object.all()
  for each in s:
  print(each.name , each.age , each.address , each.phone)

  # 如果要进行过滤筛选,使用filter()方法
  Student.objects.filter(age=18)

  ```

# 2. 添加数据

  ```
  对象 = 类() # 使用类实例化对象
  对象.属性 = 值 # 给对应的对象的属性赋值
  对象.save() # 必须要执行保存操作,否则数据没有进入数据库
  ```

  python3 manage.py shell 命令行中添加数据

  ```
  # from 应用名.models import 类名

  from myapp.models import Student

  # 实例化对象
  s = Student()

  # 给对象的属性赋值
  s.name = '张三'
  s.address = '云南昭通'
  s.phone = '13377886678'
  s.age = 20

  # 保存数据
  s.save()
  ```
- 常见查找方法

1. 通用查找格式: 属性名 _ _ (用下面的内容) =值

  - gt : 大于
  - gte : 大于等于
  - lt : 小于
  - lte : 小于等于
  - range: 范围
  - year : 年份
  - isnull : 是否为空

2. 查找等于指定值的格式: 属性名 = 值
3. 模糊查找: 属性名 _ _ (使用下面的内容) = 值

  * exact : 精确等于
  * iexact: 不区分大小写
  * contains: 包含
  * startwith: 以..开头
  * endwith: 以…结尾

# 数据库表关系

- 多表联查:利用多个表联合查找某一项信息或者多项信息
- 1:1 OneToOne
  - 建立关系:在模型任意一边即可,使用OneToOneField
  - add:
    - 添加没有关系的一边,直接实例化保存就可以

      >>> s = School()
      >>> s.school_id = 2
      >>> s.school_name = "nanjingtulingxueyuan"
      >>> s.save()

    - 添加有关系的一边,使用create方法,或者使用实例化然后save

    # 方法1
    >>> m = Manager()
    >>> m.manager_id = 10
    >>> m.manager_name = "dana"
    >>> m.my_school = s
    >>> m.save()

    # 方法2
    >>> m = Manager.objects.create(manager_id=20, manager_name="erna", my_school=ss[0])
    - query:
      - 有子表查母表: 由子表的属性直接提取信息
      - 由母表查子表:使用双下划线

      >>> s = School.objects.get(manager__manager_name="dana")
      >>> s
      <School: nanjingtulingxueyuan>

  - change:
    - 单个修改使用save
    - 批量修改使用update
    - 无论对子表还是对母表的修改
  - delete: 直接使用delete还是删除

- 1:N OneToMany
  - 一个表格的一个数据项/对象等,可以有很多个另一个表格的数据项
  - 比如:一个学校可以有很多个老师,但一个老师只能在一个学校里上班
  - 使用上
    - 使用ForengnKey
    - 在多的那一边,比如上边的例子就是在Teacher的表格里进行定义

  Add:
    - 跟一对一方法类似,通过create和new来添加
    - create: 把属性都填满,然后不需要手动保存
    - new: 可以属性或者参数为空,必须用save保存
  Query:
    - 以学校和老师的例子为准
    - 如果知道老师,查学校 ,则通过增加的关系属性,直接使用
    - 例如,查找t1老师是哪个学校的
    - 反查=
    - 有学校,我想查下这个学校所有老师,则系统自动在老师模型名称的小写下直接加下划线set,
      用来表示

- N:N ManyToMany
  - 表示任意一个表的数据可以拥有对方表格多项数据,反之亦然
  - 比如典型例子就是老师和学生的关系
  - 使用上,在任意一方,使用ManyToMany定义,只需要定义一边
- Add:
  - 添加老师,则在student.teachers.add()
- Query:
  - 跟一对多类似,使用_set查询

03-Django-models的更多相关文章

  1. Django models 操作高级补充

    Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra

  2. Django models Form model_form 关系及区别

    Django models Form model_form

  3. Django models .all .values .values_list 几种数据查询结果的对比

    Django models .all .values .values_list 几种数据查询结果的对比

  4. django models数据类型

    Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField C ...

  5. django models 类型整理 version:1.8.3

    django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 F ...

  6. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  7. Django models中关于blank与null的补充说明

    Django models中关于blank与null的补充说明 建立一个简易Model class Person(models.Model): GENDER_CHOICES=( (1,'Male'), ...

  8. Django Models的数据类型汇总

    https://blog.csdn.net/devil_2009/article/details/41735611 Django Models的数据类型 汇总 AutoField IntegerFie ...

  9. Django - models.py 应用

    Django - models.py 应用 编写 models.py 文件 from django.db import models # Create your models here. class ...

  10. 3:django models Making queries 高级进阶--聚合运算

    在前一遍文章django models Making queries里面我们提到了django常用的一些检索数据库的内容, 下面我们来看一下更为高级的检索聚合运算 这是我们要用到的模型 class A ...

随机推荐

  1. JUnit——Annotation

    Annotation是对属性,方法或者类做一个标记  比如@override表示复写了父类中的方法 [1]@Test: 测试方法(说明该方法为测试方法) a)(expected=XXException ...

  2. 【Leetcode】二分法

    题目: 在排序数组中查找元素的第一个和最后一个位置. 二分法的思想非常简单,然而其中的实现细节非常繁琐,容易出错.本推文非常详细地介绍二分法的实现细节. 总结几点注意事项: 初始上.下界的取值: 判断 ...

  3. 使用idea上传项目到码云

    首先,基本流程是这样的:       1.在码云生成SSH公钥       2.在码云创建项目      3.克隆项目到本地      4.在本地创建项目      5.搭建本地仓库,关联远程仓库   ...

  4. 一个时序图描述从用户在浏览器地址栏输入url并按回车,到浏览器显示相关内容的各个过程

    其实考察的就是一次HTTP请求所经过的过程和Spring或者SpringMVC怎么调用dispatcherServlet的过程

  5. Singleton(Java)

    1.定义私有静态易变的类变量2.定义getInstance静态方法 2.1.若静态变量为null,则在同步类类型的同时判断静态实例是否为null, 是null则创建新实例赋给静态变量 2.2.不为nu ...

  6. C# 前台和后台POST提交信息的实现方法

    一.系统A(官网)与系统B(第三方支付平台)数据交换的方式 1.1  页面浏览器方式:系统A以构造Form表单的方式,通过系统A客户的浏览器重定向到系统B(向系统B发送请求),B系统完成交易后,将交易 ...

  7. IntelliJ IDEA2018破解教程

    破解方法:下载破解补丁→修改配置文件→输入激活码→激活成功 由于JetBrains封杀,大部分激活服务器已经不能使用,使用下面的比较麻烦的方法也可以进行破解,但是有效期是到2100年(emmmm,也算 ...

  8. leetcode-mid-sorting and searching - 240. Search a 2D Matrix II -NO

    mycode   time limited def searchMatrix(matrix, target): def deal(data): if not data: return False ro ...

  9. EMQ插件通过HTTP连接认证服务器实现认证

    需求 在EMQ中添加认证插件,将到来的MQTT连接的ClientID.UserName.Password通过HTTP协议发送到认证服务器,用返回的数据决定是否允许该连接: 在连接时和断开时向服务器发送 ...

  10. 怎么用jira写bug

    工具/原料 有网的电脑 方法/步骤1: 打开公司给的访问JIRA的链接,输入公司给你注册的账号和密码,点击登录 方法/步骤2: 点击JIRA主菜单上的“创建”,进入编辑bug界面 方法/步骤3: 项目 ...