03-Django模型知识1
模型:是python中的类对应数据库中的表。
ORM:对象关系映射
1、基础示例
学生类模型字段
class blog(models.Model):
title = models.CharField(max_length=128)
creat_time = models.DateTimeField()
这个字段对应的MySQL中的表如下:
CAEATE DATABASE blog(
'id' int(11) NOT NULL AUTO_INCREMENT,
'title' varchar(128) NOT NULL,
'creat_time' datetime(6) NOT NULL,
PRIMARY KEY ('id')
)
在关系映射表中,id属于自增字段,是主键,并且不能为空。
- 模型类必须继承于models.Model。
- 每个属性对应数据库中的一个字段。
- 表名中没有指定primary_key,那么会自动创建一个id字段,为自增主键。
2、应用模型层
- 注册应用
当我们在models文件中编写了模型,需要将模型映射到数据库中。
注册应用,在settings文件中,将子应用blog注册到INSTALLED_APPS中,其结果如下图所示

在settings中配置正确的数据库连接:
Django自带的数据库配置是sqlite3,其设置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
如果我们需要配置MySQL数据库,则需要将sqlite3的配置注释,重新配置MySQL数据库。其配置方式如下:
DATABASE = {
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'root',
'PASSWORD': '',
'HOST': ''.0.0.1',
'PORT': '',
}
}
- NAME:表示数据库的名字
- PASSWORD:表示数据库的连接密码
- USER:用户名字
- HOST:代表主机号
- PORT:代表端口号
- 安装数据库对应的驱动
mysql ,安装 mysqlclient 库
sqlite3,是不需要额外安装,python自带驱动库
一些数据库需要首先创建数据库,譬如:mysql、oracle、mssql等
- 预备迁移
python manage.py makemigrations blog
1. blog 是子应用的名称,如果不指定,那么就是对所有 INSTALLED_APPS 中的应用都进行预备迁移。
2. 指定该命令后,在对应的子应用下的 migrations 中会生成一个对应的迁移文件。
- 正式迁移
python manage.py migrate blog
如果不添加子应用名,则会把所有django项目中所有应用迁移到数据库。
- 逆向从数据库表生成模型类
(1)、settings中设置好DATABASES设置
(2)、对一个数据库中建立好表,约束等
(3)在根目录的cmd中运行或者在pycharm的控制台运行以下命令
python manage.py inspectdb >blog/models.py
表示把数据库中的表映射到blog应用中的models.py文件中。上面的表格其映射出的python代码如下所示:
class blog(models.Model):
title = models.CharField(max_length=128)
creat_time = models.DateTimeField() class Meta:
managed = False
db_table = 'blog'
anaged = False 这个属性是通知django,不需要再进行从模型到数据库的迁移管理。
db_table = 'blog' 对应的数据库中的表名
3、字段Field
模型类的属性对应数据库中表的字段,都是对应的Field类的实例。
- 字段命名
由字母,下划线,数字组成。不能以数字开头。
字段名称不能是python保留字。
由于Django查询语法的原因,字段名称不能包含多个下划线。
- 常用的Field
| 类型 | 说明 |
| AutoField | 自增字段,如果未指定,数据库会自动生成。自己设置该字段,需要把设置为primary_key=True。 |
| BooleanField | 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。在数据库中显示为
tinyint(1) |
| CharField | 字符串类型。必须接收一个max_length参数 |
| DateField | 日期类型。年月日 |
| DateTimeField | 日期时间类型。年月日时分秒 |
| FloatField | 浮点数类型 |
| SmallIntegerField | 小整数,包含-32768到32767 |
| IntegerField | 整数类型 |
| TextField | 文本内容 |
示例:UUIDField的使用
import uuid
from django.db import models class student(models.Model):
id = models.UUIDField(primary_key = True, default = uuid.uuid4, editable = False)
在上面的例子中,uuid.uuid4不能写成uuid.uuid4(),后者表示的是一个固定值。editable = False表示该字段不能编辑。
- Field的常用参数
| 参数 | 说明 |
| max_length | 字段的最大长度,用于字符串 |
| null | null = True表示数据库可以存储NULL值,默认为False |
| blank | blank = True表示该字段允许为空白,用于前端用户页面,默认为False,为True时和null一起使用 |
| primary_key | primary_key = True表示为主键,如果没有设置,数据库会自动设置。默认为False |
| choices | SEX_CHOICES=((1, '男'),(2, '女')),元组中的第一个元素是将存储在数据库中的值,第二个元素是将在页面中显示的值,最常见用于下拉选择框select |
| default | 字段的默认值 |
| help_text | 用于显示额外的'帮助'文本 |
| unique | 该字段在文本中是唯一的 |
| verbose_name | 详细字段名,不指定则是字段的小写名,并用空格代替"_" |
4、模型之间的关系
主外关系中,最常用的是models.CASCADE级联删除和models.SET_NULL。设置为True。
一对多关系中,ForeignKey写在一对多关系中,多的那个模型中。
- 一对一
from django.db import models class Place(models.Model):
name = models.CharField(max_length = 64)
address = models.CharField(max_length = 128) class Restaurant(models.Model):
place = models.OneToOneField(Place, primary_key = True, on_delete = models.CASCADE)
serves_pizza = models.BooleanField(default = False)
在上述例子中,我们使用OneToOne进行关联,BooleanField 在数据库使用 tinyint 类型
- 一对多
from django.db import models class Restaurant(models.Model):
name = models.CharField(max_length = 64)
address = models.CharField(max_length = 128) class Waiter(models.Model):
restaurant = models.Foreignkey(Restaurant, on_delete = models.CASCADE)
name = models.CharField(max_length = 32)
在上述代码中,一个饭店对应多个服务员,而一个服务员只能服务于一个饭店,所以是一对多的关系。
- 多对多
简易多对多
from django.db import models class Student(models.Model):
id = AutoField(primary_key = True)
name = models.CharField(max_length = 32)
gender = models.Charfield(max_length = 1)
age = models.IntegerField() class Teacher(models.Model):
student = models.ManyToManyField(Student, on_delete = models.CASCADE)
name = models.CharField(max_length = 32)
简易多对多会创建一个中间表,用于关联两个表的主键,在中间表中,使用的是一对多的关系。
模型:是python中的类对应数据库中的表。
ORM:对象关系映射
1、基础示例
学生类模型字段
class blog(models.Model):
title = models.CharField(max_length=128)
creat_time = models.DateTimeField()
这个字段对应的MySQL中的表如下:
CAEATE DATABASE blog(
'id' int(11) NOT NULL AUTO_INCREMENT,
'title' varchar(128) NOT NULL,
'creat_time' datetime(6) NOT NULL,
PRIMARY KEY ('id')
)
在关系映射表中,id属于自增字段,是主键,并且不能为空。
- 模型类必须继承于models.Model。
- 每个属性对应数据库中的一个字段。
- 表名中没有指定primary_key,那么会自动创建一个id字段,为自增主键。
2、应用模型层
- 注册应用
当我们在models文件中编写了模型,需要将模型映射到数据库中。
注册应用,在settings文件中,将子应用blog注册到INSTALLED_APPS中,其结果如下图所示

在settings中配置正确的数据库连接:
Django自带的数据库配置是sqlite3,其设置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
如果我们需要配置MySQL数据库,则需要将sqlite3的配置注释,重新配置MySQL数据库。其配置方式如下:
DATABASE = {
'default':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',
'USER': 'root',
'PASSWORD': '',
'HOST': ''.0.0.1',
'PORT': '',
}
}
- NAME:表示数据库的名字
- PASSWORD:表示数据库的连接密码
- USER:用户名字
- HOST:代表主机号
- PORT:代表端口号
- 安装数据库对应的驱动
mysql ,安装 mysqlclient 库
sqlite3,是不需要额外安装,python自带驱动库
一些数据库需要首先创建数据库,譬如:mysql、oracle、mssql等
- 预备迁移
python manage.py makemigrations blog
1. blog 是子应用的名称,如果不指定,那么就是对所有 INSTALLED_APPS 中的应用都进行预备迁移。
2. 指定该命令后,在对应的子应用下的 migrations 中会生成一个对应的迁移文件。
- 正式迁移
python manage.py migrate blog
如果不添加子应用名,则会把所有django项目中所有应用迁移到数据库。
- 逆向从数据库表生成模型类
(1)、settings中设置好DATABASES设置
(2)、对一个数据库中建立好表,约束等
(3)在根目录的cmd中运行或者在pycharm的控制台运行以下命令
python manage.py inspectdb >blog/models.py
表示把数据库中的表映射到blog应用中的models.py文件中。上面的表格其映射出的python代码如下所示:
class blog(models.Model):
title = models.CharField(max_length=128)
creat_time = models.DateTimeField() class Meta:
managed = False
db_table = 'blog'
anaged = False 这个属性是通知django,不需要再进行从模型到数据库的迁移管理。
db_table = 'blog' 对应的数据库中的表名
3、字段Field
模型类的属性对应数据库中表的字段,都是对应的Field类的实例。
- 字段命名
由字母,下划线,数字组成。不能以数字开头。
字段名称不能是python保留字。
由于Django查询语法的原因,字段名称不能包含多个下划线。
- 常用的Field
| 类型 | 说明 |
| AutoField | 自增字段,如果未指定,数据库会自动生成。自己设置该字段,需要把设置为primary_key=True。 |
| BooleanField | 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。在数据库中显示为
tinyint(1) |
| CharField | 字符串类型。必须接收一个max_length参数 |
| DateField | 日期类型。年月日 |
| DateTimeField | 日期时间类型。年月日时分秒 |
| FloatField | 浮点数类型 |
| SmallIntegerField | 小整数,包含-32768到32767 |
| IntegerField | 整数类型 |
| TextField | 文本内容 |
示例:UUIDField的使用
import uuid
from django.db import models class student(models.Model):
id = models.UUIDField(primary_key = True, default = uuid.uuid4, editable = False)
在上面的例子中,uuid.uuid4不能写成uuid.uuid4(),后者表示的是一个固定值。editable = False表示该字段不能编辑。
- Field的常用参数
| 参数 | 说明 |
| max_length | 字段的最大长度,用于字符串 |
| null | null = True表示数据库可以存储NULL值,默认为False |
| blank | blank = True表示该字段允许为空白,用于前端用户页面,默认为False,为True时和null一起使用 |
| primary_key | primary_key = True表示为主键,如果没有设置,数据库会自动设置。默认为False |
| choices | SEX_CHOICES=((1, '男'),(2, '女')),元组中的第一个元素是将存储在数据库中的值,第二个元素是将在页面中显示的值,最常见用于下拉选择框select |
| default | 字段的默认值 |
| help_text | 用于显示额外的'帮助'文本 |
| unique | 该字段在文本中是唯一的 |
| verbose_name | 详细字段名,不指定则是字段的小写名,并用空格代替"_" |
4、模型之间的关系
主外关系中,最常用的是models.CASCADE级联删除和models.SET_NULL。设置为True。
一对多关系中,ForeignKey写在一对多关系中,多的那个模型中。
- 一对一
from django.db import models class Place(models.Model):
name = models.CharField(max_length = 64)
address = models.CharField(max_length = 128) class Restaurant(models.Model):
place = models.OneToOneField(Place, primary_key = True, on_delete = models.CASCADE)
serves_pizza = models.BooleanField(default = False)
在上述例子中,我们使用OneToOne进行关联,BooleanField 在数据库使用 tinyint 类型
- 一对多
from django.db import models class Restaurant(models.Model):
name = models.CharField(max_length = 64)
address = models.CharField(max_length = 128) class Waiter(models.Model):
restaurant = models.Foreignkey(Restaurant, on_delete = models.CASCADE)
name = models.CharField(max_length = 32)
在上述代码中,一个饭店对应多个服务员,而一个服务员只能服务于一个饭店,所以是一对多的关系。
- 多对多
简易多对多
from django.db import models class Student(models.Model):
id = AutoField(primary_key = True)
name = models.CharField(max_length = 32)
gender = models.Charfield(max_length = 1)
age = models.IntegerField() class Teacher(models.Model):
student = models.ManyToManyField(Student, on_delete = models.CASCADE)
name = models.CharField(max_length = 32)
简易多对多会创建一个中间表,用于关联两个表的主键,在中间表中,使用的是一对多的关系。
建立中间表式多对多,这种方法不需要系统自动生成多对多的中间表,而是手动创建多对多表。
from django.db import models class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50) class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(
Person,
through='Membership', # 必须是 类名的字符串 ,用 '' 包裹
through_fields=('group', 'person'),
) class Membership(models.Model):
group = models.ForeignKey(Group, on_delete=models.CASCADE)
person = models.ForeignKey(Person, on_delete=models.CASCADE)
level = models.IntegerField(default=1)
- 通过 through='Membership' 指定Membership作为中间表
- 通过 through_fields=('group', 'person') 指定中间模型的属性
- 一般需要自定义中间表时,都是有额外的字段,譬如 level = models.IntegerField(default=1)
03-Django模型知识1的更多相关文章
- 03 Django模型层: 常用(非常用)字段和参数
Django模型层: 常用(非常用)字段和参数 1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为i ...
- 第四章:Django 模型 —— 设计系统表
1. Django框架提供了完善的模型(Model )层来创建和存储数据,每一个模型对应数据库中的唯一的一张表. 2. Django 模型基础知识: .每一本模型是一个Python类,继承了djang ...
- Django模型层(2)
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...
- Django模型层Meta内部类详解
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会对应 ...
- django模型
用django时,只要用到数据库就得用到模型. 一.数据库的MTV开发模式 从MVC到MTV 所谓软件架构的MVC模式将数据的存取逻辑(Module),表现逻辑(View)和业务逻辑(Controll ...
- 【Python】django模型models的外键关联使用
Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-618303.html 字段属性:http://www.cnblogs ...
- django模型中的抽象类(abstract)
首先介绍下django的模型有哪些属性:先看例子: Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract 这个属性是定义当前的模 ...
- Django模型之Meta选项详解
Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.而可用的选项大致包含以下几类 abstract 这个属性是定义当前的模型是不是一个抽象类.所谓抽象类是不会对应数据 ...
- Django模型-数据库操作
前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...
- python django模型内部类meta详细解释
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.下面对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会相应 ...
随机推荐
- Mybatis源码手记-从缓存体系看责任链派发模式与循环依赖企业级实践
一.缓存总览 Mybatis在设计上处处都有用到的缓存,而且Mybatis的缓存体系设计上遵循单一职责.开闭原则.高度解耦.及其精巧,充分的将缓存分层,其独到之处可以套用到很多类似的业务上.这里将主要 ...
- 通信中的错误代码 (repost from https://blog.csdn.net/zzhuan_1/article/details/80066716)
• 100 - 继续.• 101 - 切换协议.• 110 重新启动标记答复.• 120 服务已就绪,在 nnn 分钟后开始.• 125 数据连接已打开,正在开始传输.• 150 文件状态正常,准备打 ...
- 深度学习中环境配置的一些经验总结(conda 常用命令)
前两个月参加了学校的国创项目,和一个外院的同学组队.课题是基于深度学习的新闻图片中网络暴力元素的检查. 6月末最后一门试考完,正式开始暑假,便有了大把时间搞这个国创项目(反正没有其他事干).两个组凑钱 ...
- 《Java并发编程的艺术》第6/7/8章 Java并发容器与框架/13个原子操作/并发工具类
第6章 Java并发容器和框架 6.1 ConcurrentHashMap(线程安全的HashMap.锁分段技术) 6.1.1 为什么要使用ConcurrentHashMap 在并发编程中使用Has ...
- 解决错误 CS1617 Invalid option '7.1' for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6.
解决错误 CS1617 Invalid option '7.1' for /langversion; must be ISO-1, ISO-2, Default or an integer in ra ...
- WeChair项目Alpha冲刺(5/10)
团队项目进行情况 1.昨日进展 Alpha冲刺第五天 昨日进展: 前端:完成小程序登录态的定义 后端:成功部署项目到服务器并能通过域名访问项目 数据库:调整属性数据类型 2.今日安排 前端:完善 ...
- redis cluster集群中键的分布算法
Redis Cluster Redis Cluster是Redis的作者 Antirez 提供的 Redis 集群方案 —— 官方多机部署方案,每组Redis Cluster是由多个Redis实例组成 ...
- Hystrix总结
Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复. Hystrix能做什么? ...
- Idea中SpringBoot整合JSP
最近在学习SpringBoot,看到SpringBoot整合jsp,顺带记录一下. 1.创建一个SpringBoot项目 点击Next 注意:packaging选中War,点击Next Webà选中W ...
- Python之浅谈基础
执行python的两种方式 交互式(jupyter) 通过cmd或jupyter运行python代码 优点:运行一句执行一句 缺点:关闭cmd或jupyter后数据消失 命令行式(pycharm) 优 ...