Django模型
Django对各种据库提供了很好的支持,包括:PostgreSQL, MySQL, SQLite, Oracle。
Django未这些数据库提供了统一的调用API。我们可以根据自己业务需求选择不同的数据库。
MySQL是Web应用中最常用的数据库,我们将以Mysql作为是开进行介绍。
如果你没安装mysql驱动,可以执行以下命令安装:
sudo pip install pymysql
Collecting pymysql
Downloading https://files.pythonhosted.org/packages/ed/39/15045ae46f2a123019aa968dfcba0396c161c20f855f11dea6796bcaae95/PyMySQL-0.9.3-py2.py3-none-any.whl (47kB)
100% |████████████████████████████████| 51kB 57kB/s
Installing collected packages: pymysql
Successfully installed pymysql-0.9.3
(djangovenv) LydiadeMacBook-Pro:testLocalHost apple$
Django ORM
Django模型使用自带的ORM。
对象关系映射(Object Relational Mapping, 简称ORM)用于实现面向对象编程语言里不同类型系统的数据之间的转换。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORMORM是通过描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。
使用ORM的好处:
- 提高开发效率。
- 不同数据库可以平滑切换
使用ORM的缺点:
- ORM转换为SQL语句时,需要花费一定的时间,执行效率会有所降低。
- 长期写ORM代码,会降低编写SQL语句的能力。
ORM解析过程:
1、 ORM会将Python代码转成SQL语句。
2、SQL语句通过pymysql传送到数据库服务端。
3、在数据库中执行SQL语句并将结果返回。
ORM关系对应表:
数据库配置
Django 如何使用 mysql 数据库
MAC下载mysql地址:https://dev.mysql.com/downloads/mysql/
ORM无法操作到数据级别,只能操作到数据库表。
创建MySQL 数据库语法,数据库名称为 database:
create database runoob default charset=utf8;
我们在项目的settings.py文件中找到DATABASE配置项,将其信息修改为:
testLocalHost/testLocalHost/settings.py 文件代码:
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'runoob', # 数据库名称
'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
'PORT': 3306, # 端口
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
上面包含数据库名称和用户的信息,它们与MySQL中对应数据库和用户的设置相同。Django根据这一设置,与MySQL中相应的数据库和用户连接起来。
接下来,告诉Django 使用 pymysql 模块连接 mysql 数据库:
实例:
# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
import pymysql
pymysql.install_as_MySQLdb()
定义模型
创建APP
Django 规定,如果要使用模型,必须要创建一个app。我们使用以下命令创建一个TestModel 的app:
django-admin.py startapp TestModel
目录结构如下:
testLocalHost
|-- HelloWorld
|-- manage.py
...
|-- TestModel
| |-- __init__.py
| |-- admin.py
| |-- models.py
| |-- tests.py
| `-- views.py
修改TestModel/models.py 文件,代码如下:
# testLocalHost/TestModel/models.py文件代码:
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20)
以上的类名代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime),max_length 参数限定长度。
接下来在 settings.py 中找到INSTALLED_APPS这一项,如下:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel', # 添加此项
)
在命令行中运行:
$ python manage.py migrate # 创建表结构
(djangovenv) LydiadeMacBook-Pro:testLocalHost apple$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, 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 admin.0003_logentry_add_action_flag_choices... 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 auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK
(djangovenv) LydiadeMacBook-Pro:testLocalHost apple$
$ python manage.py make migrations TestModel # 让 Django 知道我们在我们的模型有一些变更
(djangovenv) LydiadeMacBook-Pro:testLocalHost apple$ python manage.py make migrations TestModel
Migrations for 'TestModel':
TestModel/migrations/0001_initial.py
- Create model Test
$ python manage.py migrate TestModel # 创建表结构
(djangovenv) LydiadeMacBook-Pro:testLocalHost apple$ python manage.py migrate TestModel
Operations to perform:
Apply all migrations: TestModel
Running migrations:
Applying TestModel.0001_initial... OK
常见报错信息
如果执行以上命令时出现以下报错信息:
原因是 MySQLclient 目前只支持到 Python3.4,因此如果使用的更高版本的 python,需要修改如下:
if version < (1, 3, 13):
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
一般点报错的代码文件路径信息,会自动跳转到报错文件中行数,通过报错信息的文件路径找到 ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql 这个路径里的 base.py 文件,此时把报错的代码行数注释掉(代码在文件开头部分)。
数据库操作
在 testLocalHost 目录中添加 testdb.py 文件,并修改 urls.py:
# testLocalHost/testLocalHost.py文件代码
from django.urls import path
from . import views,testdb
urlpatterns = [
path('runoob/', views.runoob),
path('testdb/', testdb.testdb),
]
添加数据
添加数据需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT:
# testLocalHost/testLocalHost/testdb.py 文件代码
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
test1 = Test(name='runoob')
test1.save()
return HttpResponse("<p>数据添加成功!</p>")
访问 http://127.0.0.1:8000/testdb 就可以看到数据添加成功的提示。结果如下: