Django从理论到实战(part26)--ORM模型
学习笔记,仅供参考
参考自:Django打造大型企业官网–Huang Y;
本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列中,尽量详细的记录一下。
ORM模型
ORM模型介绍
ORM
,全称Object Relational Mapping
,中文叫做对象关系映射,通过ORM
我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性,ORM
在执行对象操作的时候,最终还是会把对应的操作转换为数据库原生sql语句。
创建ORM模型
ORM
模型一般放在app
的models.py
文件中,每个app
都可以拥有自己的模型,并且如果这个模型想要映射到数据库中,那么这个app
必须要在settings.py
的INSTALLED_APP
中进行安装,下面是一个书籍ORM
模型:
from django.db import models
class Book(models.Model):name = models.CharField(max_length=20,null=False)author = models.CharField(max_length=20,null=False)pub_time = models.DateTimeField(default=datetime.now)price = models.FloatField(default=0)
上面这个模型继承自django.db.models.Model
类,如果这个模型想要映射到数据库中,就必须继承自这个类。
当这个模型映射到数据库中时,表名是模型名称的小写形式(book),在这个表中,有四个字段,一个为name
,该字段保存书的名称,是varchar
类型,最长不能超过20个字符,并且不能为空;第二个字段为作者姓名,同样也是varchar
类型,长度不能超过20个;第三个为出版时间,是datetime
类型,默认是保存这本书籍的时间;第五个字段是这本书的价格,为浮点类型。
还有一个字段为主键id
,在django
中,如果一个模型没有定义主键,那么将会自动生成一个自动增长的int
类型的主键,并且这个主键的名字就叫做id
。
映射模型到数据库中
下面我们用案例,学习一下这个知识点。
- 创建数据库
create database mynewbook default charset utf8 collate utf8_general_ci;
- 创建新项目
django-admin startproject newbookstore1
- 创建新的应用
python manage.py startapp bookstore
- 在
settings.py
中,配置DATABASES
和INSTALLED_APPS
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','bookstore',
]DATABASES = {'default': {# 数据库引擎(是mysql还是oracle等)'ENGINE': 'django.db.backends.mysql',# 数据库的名字'NAME': 'mynewbook',# 连接mysql数据库的用户名'USER': 'root',# 连接mysql数据库的密码'PASSWORD': '19970928',# mysql数据库的主机地址'HOST': '127.0.0.1',# mysql数据库的端口号'PORT': '3306',},
}
- 在
app
的models.py
中定义模型,该模型必须继承自django.db.models
from django.db import models# Create your models here.class Book(models.Model):#定义一个自增长的主键bookid = models.AutoField(primary_key = True)name = models.CharField(max_length=20,null=False)author = models.CharField(max_length=20,null=False)price = models.FloatField(default=0)
- 迁移
在cmd终端内,进入到项目所在的路径,执行命令python manage.py makemigrations
,生成迁移脚本文件:
python manage.py makemigrations
#输出
Migrations for 'bookstore':bookstore\migrations\0001_initial.py- Create model Book
在执行完上述代码后,Django为我们生成了一个迁移脚本0001_initial.py,我们去看看里面都有啥:
from django.db import migrations, modelsclass Migration(migrations.Migration):initial = Truedependencies = []operations = [migrations.CreateModel(name='Book',fields=[('bookid', models.AutoField(primary_key=True, serialize=False)),('name', models.CharField(max_length=20)),('author', models.CharField(max_length=20)),('price', models.FloatField(default=0)),],),]
之后,当我们调用python manage.py migrate
时,Django就会根据迁移脚本中的这些代码,映射到数据库中。
执行命令python manage.py migrate
,将迁移脚本文件映射到数据库中:
python manage.py migrate
#输出
Operations to perform:Apply all migrations: admin, auth, bookstore, contenttypes, sessions
Running migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying bookstore.0001_initial... OKApplying sessions.0001_initial... OK
我们看到Django帮我们生成了许多数据表,这是由于Django存在很多内置的应用,它们内部也有models.py模型文件,当我们第一次进行迁移时,Django就会生成与这些模型对应的数据表。
现在,我们查看mynewbook数据库中的数据表:
mysql> use mynewbook;
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_mynewbook |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| bookstore_book |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
11 rows in set (0.00 sec)
再查看一下 bookstore_book表的描述信息:
mysql> desc bookstore_book;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| bookid | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| author | varchar(20) | NO | | NULL | |
| price | double | NO | | NULL | |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
可以看到,这和我们在models.py中设定的完全相同。
Django从理论到实战(part26)--ORM模型相关推荐
- Django从理论到实战(part27)--ORM模型的增删改查操作
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...
- Django从理论到实战(part28)--ORM常用Field详解
学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: ORM常用Field详解 AutoField 映射到数据库中是int类型,可以有自动增长的特性.一般不需要使用这个类型,如果 ...
- Django从理论到实战(part51)--User模型
学习笔记,仅供参考,有错必纠 摘自:pink老师教案 文章目录 User模型 字段 User模型的基本用法 创建用户 创建超级用户 修改密码 登录验证 User模型 User模型是Django框架的核 ...
- Django从理论到实战(part50)--使用模型来处理上传的文件
学习笔记,仅供参考,有错必纠 文章目录 使用模型来处理上传的文件 `MEDIA_ROOT`和`MEDIA_URL` 限制文件的扩展名 使用模型来处理上传的文件 在定义模型的时候,我们可以给存储文件的字 ...
- Django从理论到实战(part35)--QuerySetAPI
学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y:官方文档 QuerySet API 我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作.其实模 ...
- Django 第十课 1.【ORM模型】
ORM模型介绍 随着项目的越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1:SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL ...
- Django从理论到实战(part54)--MEDIA_ROOT和MEDIA_URL
学习笔记,仅供参考,有错必纠 引用:使用模型来处理上传的文件:Django static静态配置文件 MEDIA_ROOT和MEDIA_URL 变量解释 MEDIA_ROOT:指定用户上传文件的本地路 ...
- Django从理论到实战(part49)--ModelForm
学习笔记,仅供参考,有错必纠 参考自:某网课 ModelForm 我门在写表单的时候,会发现表单中的Field和模型中的Field基本上是一模一样的,而且表单中需要验证的数据,也就是我们模型中需要保存 ...
- Django从理论到实战(part47)--ListView类
学习笔记,仅供参考,有错必纠 参考自:Django打造大型企业官网–Huang Y: 文章目录 类视图 ListView类 举个例子 Paginator和Page类 Paginator常用属性 Pag ...
最新文章
- RRDTool 存储原理简介——基于时间序列的环型数据库
- 一个5节点的polardb mysql_POLARDB问题
- python中如果要多次输入文本,关于文本游戏:文本游戏 – 如果语句基于输入文本 – Python...
- 一步一步教你如何将 yolov3/yolov4 转为 caffe 模型
- sql多层嵌套别名无效_SQL之复杂查询
- cuba 平台_认识CLI for CUBA平台
- gis 联合 融合_GIS技术进化 | 我们为何需要跨平台GIS技术体系?
- Python案例:四种方式编程求解一元二次方程
- 马斯克称下一代超级工厂占地可能没必要更大 但可能更先进
- win10删除*某些设置由你的组织来管理
- 如何将U盘设置为启动盘
- PMO和PM如何准备项目状态报告及进行项目进度汇报?【附项目状态表和进度跟踪表】
- Netty实现聊天室
- Android APP热更新中的插件化(Hook技术:反射或动态代理),Demo (2)
- 2022.10.10 英语背诵
- 编程java摇号购房,用java编写摇号器
- HTML 的静态网页分页样式
- More Effective C++ 阅读笔记 解释清晰
- 2020-09-23
- 国培计算机培训奥鹏,完整版奥鹏国培培训网络研修总结,推荐文档
热门文章
- 查看ubuntu linux开放的端口以及控制端口范围
- Ubuntu下面Master PDF Editor背景颜色设置
- php copy 图片_PHP-imagecopy黑色背景
- python控制台动画_Python真神奇,带你体验另类的“全自动编程”
- 移动端cube界面设计html,滴滴 Web 移动端组件库 cube-ui 开源
- MySQL存储过程及触发器
- The compiler compliance specified is 1.7 but a JRE
- 使用git时ssh提示“Load key /home/devid/.ssh/id_rsa: bad permissions”的解决办法
- linux安装python3.6以后报错处理
- 服务器防渗透(1)--信息收集