03-Django-models
# 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的更多相关文章
- Django models 操作高级补充
Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra
- Django models Form model_form 关系及区别
Django models Form model_form
- Django models .all .values .values_list 几种数据查询结果的对比
Django models .all .values .values_list 几种数据查询结果的对比
- django models数据类型
Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField C ...
- django models 类型整理 version:1.8.3
django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 F ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- Django models中关于blank与null的补充说明
Django models中关于blank与null的补充说明 建立一个简易Model class Person(models.Model): GENDER_CHOICES=( (1,'Male'), ...
- Django Models的数据类型汇总
https://blog.csdn.net/devil_2009/article/details/41735611 Django Models的数据类型 汇总 AutoField IntegerFie ...
- Django - models.py 应用
Django - models.py 应用 编写 models.py 文件 from django.db import models # Create your models here. class ...
- 3:django models Making queries 高级进阶--聚合运算
在前一遍文章django models Making queries里面我们提到了django常用的一些检索数据库的内容, 下面我们来看一下更为高级的检索聚合运算 这是我们要用到的模型 class A ...
随机推荐
- Ajax异步提交的步骤
1.创建XHR对象 ,XMLHttpRequest(该对象负责悄悄滴与服务器进行交互): 2.设置响应函数/回调函数(响应函数规定对返回自服务器的信息如何进行处理): 3.通过xmlhttp.open ...
- 也谈HTTP协议
HTTP(HyperText Transfer Protocol,超文转移协议,超文本传输协议的译法并不严谨.) 一.网络基础 TCP/IP 1.1 TCP/IP 协议族 TCP/IP 协议族是互联网 ...
- Spring Boot教程(八)创建含有多module的springboot工程
创建根工程 创建一个maven 工程,其pom文件为: <?xml version="1.0" encoding="UTF-8"?> <pro ...
- js的浅拷贝和深拷贝和应用场景
为什么会用到浅拷贝和深拷贝 首先来看一下如下代码 let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e ...
- git && github 相关
权限问题(error: The requested URL returned error: 403 Forbidden while accessing):1. 将自己机器的ssh public key ...
- 惠普服务器DL360G6安装ESXi主机后遗忘密码用u盘重置密码
惠普服务器DL360G6安装ESXi主机后遗忘密码重置密码 先用rufus制作U盘启动盘,启动盘一定要用惠普专用hpe的esxi版本,否则安装会报错, 下载https://www.iplaysoft. ...
- 一、基础篇--1.1Java基础-重载和重写的区别
重载和重写的区别 重写: 1.也叫子类的方法覆盖父类的方法,要求返回值.方法名和参数都相同: 2.子类抛出的异常不能超过父类相应方法抛出的异常.(子类异常不能超出父类异常): 3.子类方法的的访问级别 ...
- Webpack的tapable 为什么要使用 new Funtion 来生成静态代码
为了保持代码的单态(monomorphism). 这涉及到了js引擎优化的一些问题, tapable从1.0.0版本开始就用new Function来生成静态代码最后来来执行, 以确保得到最优执行效率 ...
- 阶段3 1.Mybatis_12.Mybatis注解开发_6 mybatis注解开发一对一的查询配置
新建Account实体类 生成getter和setter还有toString方法 先创建dao类 全局的配置,这里要改成package 创建多对一的关系 在查询的时候输出user这个对象的内容 建立查 ...
- 2018.03.26 Python-Pandas 字符串常用方法
import numpy as np import pandas as pd 1 #字符串常用方法 - strip s = pd.Series([' jack ','jill',' jease ',' ...