ORM模型
在写models.py基本用法之前,我们先来了解一下自己的的写的sql缺点:
随着我们写的项目越来越大,如果还继续使用原生sql语句去写的话,那么将会出现以下问题:
- SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。
- 很多SQL语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些SQL语句的修改。
- 自己写的sql语句可能安全性不高,容易造成sql注入等web安全问题。
ORM简介
ORM全称为Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性(以下会有解释),ORM在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。
创建ORM模型
前奏
老规矩,先创建一个项目吧:
(my_env) F:\ENV>django-admin startproject model_test
然后创建一个app(name:book)
(my_env) F:\ENV\model_test>python manage.py startapp book
使用pycharm打开项目,项目目录如下:
F:.
│ manage.py
│
├─.idea
│ │ misc.xml
│ │ model_test.iml
│ │ modules.xml
│ │ workspace.xml
│ │
│ └─inspectionProfiles
│ profiles_settings.xml
│
├─book
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ └─migrations
│ __init__.py
│
└─model_test
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
│
└─__pycache__
settings.cpython-36.pyc
__init__.cpython-36.pyc
现在创建一个数据库(name:model_test),推荐使用Naicat(因为简单),新建号之后,我们任何表都没有,不要着急,接着来。
打开settings.py文件,修改数据库配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'model_test',
'USER': 'root',
'PASSWORD': '自己的mysql密码',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
models.py编写
在bookapp中打开models.py文件,修改代码如下
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)
price = models.FloatField(default=0)
以上便定义了一个模型。这个模型继承自django.db.models.Model,如果这个模型想要映射到数据库中,就必须继承自这个类。这个模型以后映射到数据库中,表名是模型名称的小写形式,为book。在这个表中,有四个字段,一个为name,这个字段是保存的是书的名称,是varchar类型,最长不能超过20个字符,并且不能为空。第二个字段是作者名字类型,同样也是varchar类型,长度不能超过20个。第三个是这本书的价格,是浮点类型。还有一个字段我们没有写,就是主键id,在django中,如果一个模型没有定义主键,那么将会自动生成一个自动增长的int类型的主键,并且这个主键的名字就叫做id。
- 在Django中,定义了一些Field来与数据库表中的字段类型来进行映射。以下将介绍那些常用的字段类型(仅以这个项目用到的为例,简单)。
- AutoField:
映射到数据库中是int类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动的生成一个叫做id的自动增长的主键。如果你想指定一个其他名字的并且具有自动增长的主键,使用AutoField也是可以的。 - CharField:
在数据库层面是varchar类型。在Python层面就是普通的字符串。这个类型在使用的时候必须要指定最大的长度,也即必须要传递max_length这个关键字参数进去。 - FloatField:
浮点类型。映射到数据库中是float类型。
- AutoField:
- 如果我们想将这个Book类对应数据库的表,那么我们还需要配置settings.py,就是将这个book app添加到 INSTALLED_APPS中:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'book',
]
现在models.py文件已经写完了,我们如果将这个类映射到数据库中呢,django为我们编写好了两个命名,依次执行下面两个命令就ok
(my_env) F:\ENV\model_test>python manage.py makemigrations
这个命令是生成数据库迁移脚本,如果没有报错,会看到以下提示:
Migrations for 'book':
book\migrations\0001_initial.py
- Create model Book
然后还记得我们app一直没有说到的migrations文件夹吗?打开看一下,下面是这个文件夹目录:
F:.
│ 0001_initial.py
│ __init__.py
│
└─__pycache__
__init__.cpython-36.pyc
有一个0001_initial.py文件,顾名思义,初始化,我们看看这个源码:
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Book',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
('author', models.CharField(max_length=20)),
('price', models.FloatField(default=0)),
],
),
]
看到这个文件基本我们就有一种恍然大悟的感觉,django已经为我们做了一些特殊的事情,将我们写的类对应数据库写到了一个新的python文件中,注意到fiels的id没有,我们起初没有在类中定义,但是这里自动帮我们定义了,并且是models.AutoField类型。
- 迁移脚本已经生成,那么现在就该映射到数据库里面了。在映射之前,我们看一眼数据库中的表,是空的,下面一行代码,会发生神奇的事情:
如果没有问题,会有以下提示:(my_env) F:\ENV\model_test>python manage.py migrate
Operations to perform: Apply all migrations: admin, auth, book, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying book.0001_initial... OK Applying sessions.0001_initial... OK
现在在看一个数据库的表:
对,已经成功了!恭喜你。对照着这个表,仔细看看之后python manage.py migrate命令之后cmd给我们的输出,再想想settings.py中INSTALLED_APPS,相信大家会有一种新的领悟,django很神奇。
总结一下吧
- 将ORM模型映射到数据库中,总结起来就是以下几步:
- 在settings.py中,配置好DATABASES,做好数据库相关的配置。
- 在app中的models.py中定义好模型,这个模型必须继承自django.db.models。
- 将这个app添加到settings.py的INSTALLED_APP中。
- 在命令行终端,进入到项目所在的路径,然后执行命令python manage.py makemigrations来生成迁移脚本文件。
- 同样在命令行中,执行命令python manage.py migrate来将迁移脚本文件映射到数据库中。
到这里,先告一段落,以后会尽快更新MVT!最后呼吁大家外出戴口罩,为自己,为国家。
In [1]: from datetime import datetime
In [2]: datetime.now()
Out[2]: datetime.datetime(2020, 2, 1, 15, 2, 41, 743080)
打卡完成~~~