Django来敲门~第一部分【5.2.模型和数据库交互】
2017-06-12 12:37
465 查看
为学日益。为道日损。损之又损,以至於无为。无为而不为。
——老子《道德经》
书接上文,我们继续http://www.jianshu.com/p/5a9634c3e833
通常情况下,如果你只是做测试使用,可以使用Django内置的数据库SQLite就完全可以满足需要了,我们在本次教程中,通过使用MySQL这个数据库来完成后续的功能操作
我们首先要做的是,在配置文件中指定数据库的配置,先简单了解一下
数据库配置,首先要配置对应的数据库引擎对象和数据库连接信息
在DATABASES的default配置中进行默认配置
ENGINE:数据库引擎配置,可以从
NAME:数据库名称,也就是我们项目要连接的数据库名称,如果使用默认的SQLite,数据库就是一个保存在我们电脑上的文件,NAME就必须指定绝对路径(当然这是废话,Django已经帮我们把这些事情都做好了)
同时还可以使用
注意:如果在项目中使用的数据库不是默认的SQLite,请确保你的数据库是存在的
废话不说,上干货http://www.jianshu.com/p/5a9634c3e833
打开
这里需要注意,大家可以看到,在
这是因为Django常规情况下使用的
骚年,期待你在使用到时候,官方能提供和Python3.6配套的mysqldb来进行数据库操作。或者你直接参与到官方的开发队伍中,那就更完美了~
3.1. 创建模型对象
常规情况下,我们需要在程序中,通过类和对象来封装我们的数据,方便数据的统一管理和使用,Django中对模型对象的规范做的更加的统一了,通常情况下将模块应用对象会常见在应用的
废话不说,直接上干货:http://www.jianshu.com/p/5a9634c3e833
在我们
3.2. 管理模型对象
一旦创建好了我们的模型类型,需要在项目中使用这些模型和数据库中的数据进行交互,首先我们要做的是~将我们模块应用
很神奇的一句话:“纳入到项目管理中”,难道之前就木有在项目管理中吗?那我们是在启动项目后怎么访问到polls引用的视图的呢?!
换一句话大家可能就明白了,你作为中华人民共和国的一等良民,国家财政会给你发补贴福利吗?不会!但是如果把你纳入到国家的编制中,你就可以享受国家财政给你发放的工资补贴福利等等资源了,这里也是一样,前面创建的
在我们项目中,通过项目的
默认情况下
我们要做的是什么呢,打开模块应用
我们修改
至此~配置部分就完全OK啦
3.3. 使用模型对象
上面项目部分开发配置完成后,我们Django能做什么呢?
自动创建模块应用中模型对应的数据表(Create Table <table_name>)
自动生成访问Question和Choice模型对象的API接口
这么神奇?上干货:
执行如下命令,进行数据库同步:
执行的结果你会看到:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/23e64458561adfb4993e53ecf27415a2)
makemigrations执行结果
运行
migrations会将这些改变信息保存在模块应用的migraions文件夹下,如上面的操作会生成这样一个文件:
我们再填一把火,查看Django自动给我们创建的SQL语句吧
执行结果如下:
我们会看到一个很神奇的结果,我们创建的Question和Choice模型数据,被Django自动转换成了SQL语句了
注意问题:由migrations引发的臆想
由makemigrations根据模型自动生成的sql语句,严重依赖指定的数据库,切记这样的SQL不是通用的,这里生成的SQL语句只能用于MySQL数据库
主键是自动增长的(当然你也可以修改不让自动增长),并且会根据指定的数据库自动匹配,如
默认情况下Django会自动给外键增加_id的形式命名(同样可以修改哦)
最重要的是:
当然,如果不需要修改SQL,直接执行的话,运行
3.4. 使用模型对象的API操作
在命令行通过
执行如下命令:
就可以在命令行中,进行API的测试了
未完待续:5.3. 后台管理系统http://www.jianshu.com/p/5a9634c3e833
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/a18f1ba46b01f26ab9a351310b707e0b)
Django来敲门
——老子《道德经》
书接上文,我们继续http://www.jianshu.com/p/5a9634c3e833
2. 数据库配置【MySQL】
通常情况下,如果你只是做测试使用,可以使用Django内置的数据库SQLite就完全可以满足需要了,我们在本次教程中,通过使用MySQL这个数据库来完成后续的功能操作我们首先要做的是,在配置文件中指定数据库的配置,先简单了解一下
数据库配置,首先要配置对应的数据库引擎对象和数据库连接信息
在DATABASES的default配置中进行默认配置
ENGINE:数据库引擎配置,可以从
django.db.backends.sqlite3、
django.db.backends.postgresql、
django.db.backends.mysql或者
django.db.backends.oracle中选择一个
NAME:数据库名称,也就是我们项目要连接的数据库名称,如果使用默认的SQLite,数据库就是一个保存在我们电脑上的文件,NAME就必须指定绝对路径(当然这是废话,Django已经帮我们把这些事情都做好了)
同时还可以使用
USER、
PASSWORD、
HOST等等这些配置来配置更加详细的信息
注意:如果在项目中使用的数据库不是默认的SQLite,请确保你的数据库是存在的
废话不说,上干货http://www.jianshu.com/p/5a9634c3e833
打开
mysite/mysite/settings.py配置文件,添加数据库连接配置信息
# 引入pymysql模块 import pymysql # 指定按照mysqldb的方式使用 pymysql.install_as_MySQLdb() # 修改DATABASES配置 DATABASES = { 'default': { # 数据库连接字符串 'ENGINE':"django.db.backends.mysql", # 数据库名称 "NAME":"pydb", # 数据库登录账号 "USER":"root", # 数据库登录密码 "PASSWORD":"", # 数据库所在主机IP,本机可以不用填写 "HOST":"", # 数据库连接端口,MySQL默认3306 "PORT":"3306" } }
这里需要注意,大家可以看到,在
mysite/mysite/settings.py文件的开头,引入了
pymysql并且调用了它的方法
install_as_MySQLdb()
这是因为Django常规情况下使用的
mysqldb模块来连接数据库,但是python3.4+的版本还没有对应的
mysqldb,目前使用的是第三方的
pymysql模块,所以这里进行了这样的改造。
骚年,期待你在使用到时候,官方能提供和Python3.6配套的mysqldb来进行数据库操作。或者你直接参与到官方的开发队伍中,那就更完美了~
3. 创建模型应用并和数据库交互
3.1. 创建模型对象
常规情况下,我们需要在程序中,通过类和对象来封装我们的数据,方便数据的统一管理和使用,Django中对模型对象的规范做的更加的统一了,通常情况下将模块应用对象会常见在应用的
模块应用/models.py文件中
废话不说,直接上干货:http://www.jianshu.com/p/5a9634c3e833
在我们
mysite项目的
polls应用中,创建模型对象
# 引入django.db模块中的models模块 from django.db import models # 创建一个**问题**类型 class Question(models.Model): # 创建一个问题描述属性,指定为字符串类型,最大长度200个字符 question_text = models.CharField(max_length = 200) # 创建一个发布时间属性,指定为日期时间类型 pub_date = models.DateTimeField("date published") # 创建一个**解决方案**类型 class Choice(models.Model): # 将解决方案和问题关联起来,通过外键的形式 question = models.ForeignKey(Question, on_delete=models.CASCADE) # 解决方案的描述信息,字符串,最大长度200 choice_text = models.CharField(max_length=200) # 解决方案的投票总数,整数类型,默认0 votes = models.IntegerField(default = 0)
3.2. 管理模型对象
一旦创建好了我们的模型类型,需要在项目中使用这些模型和数据库中的数据进行交互,首先我们要做的是~将我们模块应用
polls纳入到项目管理中
很神奇的一句话:“纳入到项目管理中”,难道之前就木有在项目管理中吗?那我们是在启动项目后怎么访问到polls引用的视图的呢?!
换一句话大家可能就明白了,你作为中华人民共和国的一等良民,国家财政会给你发补贴福利吗?不会!但是如果把你纳入到国家的编制中,你就可以享受国家财政给你发放的工资补贴福利等等资源了,这里也是一样,前面创建的
polls应用只是项目中的一部分,我们只有通过类似编制的东东让项目
mysite给
polls添加一个编制,项目就可以处理模块应用
polls/中的模型数据了
在我们项目中,通过项目的
mysite/mysite/settings.py配置文件的
INSTALLED_APPS选项来进行项目应用的管理
默认情况下
mysite/mysite/settings.py配置信息如下
INSTALLED_APPS = [ 'django.contrib.admin',# 默认提供的后台管理网站 'django.contrib.auth',# 权限认证模块 'django.contrib.contenttypes',#内容编码框架模块 'django.contrib.sessions',# session回话管理框架模块 'django.contrib.messages',# 消息队列处理模块 'django.contrib.staticfiles',# 项目静态文件管理模块 ]
我们要做的是什么呢,打开模块应用
polls/app.py应用描述文件,可以看到里面定义了模块应用的名称,对,说的就是它!!!!
from django.apps import AppConfig # 模块应用的名称 class PollsConfig(AppConfig): name = 'polls'
我们修改
mysite/mysite/settings.py配置文件,添加模块应用
INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin',# 默认提供的后台管理网站 'django.contrib.auth',# 权限认证模块 'django.contrib.contenttypes',#内容编码框架模块 'django.contrib.sessions',# session回话管理框架模块 'django.contrib.messages',# 消息队列处理模块 'django.contrib.staticfiles',# 项目静态文件管理模块 ]
至此~配置部分就完全OK啦
3.3. 使用模型对象
上面项目部分开发配置完成后,我们Django能做什么呢?
自动创建模块应用中模型对应的数据表(Create Table <table_name>)
自动生成访问Question和Choice模型对象的API接口
这么神奇?上干货:
执行如下命令,进行数据库同步:
python3 manage.py makemigrations polls
执行的结果你会看到:
makemigrations执行结果
运行
makemigrations命令,就是告诉Django我们对指定的模型,如
polls,进行了什么改变,并将这些改变信息存储起来
migrations会将这些改变信息保存在模块应用的migraions文件夹下,如上面的操作会生成这样一个文件:
mysite/polls/migrations/0001_initial.py,打开直接就可以看到具体的描述信息了。
我们再填一把火,查看Django自动给我们创建的SQL语句吧
# 执行sqlmigrate命令得到刚才执行makemigrations命令生成的sql语句 python3 manage.py sqlmigrate polls 0001
执行结果如下:
D:\resp_work\PY_WORK\mysite>python3 manage.py sqlmigrate polls 0001 BEGIN; -- -- Create model Choice -- CREATE TABLE `polls_choice` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL); -- -- Create model Question -- CREATE TABLE `polls_question` ( `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL); -- -- Add field question to choice -- ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL; ALTER TABLE `polls_choice` ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`); COMMIT;
我们会看到一个很神奇的结果,我们创建的Question和Choice模型数据,被Django自动转换成了SQL语句了
注意问题:由migrations引发的臆想
由makemigrations根据模型自动生成的sql语句,严重依赖指定的数据库,切记这样的SQL不是通用的,这里生成的SQL语句只能用于MySQL数据库
主键是自动增长的(当然你也可以修改不让自动增长),并且会根据指定的数据库自动匹配,如
auto_increment(MySQL)、
serial(PostgreSQL)、
integer primary key autoincrement(SQLite)等等
默认情况下Django会自动给外键增加_id的形式命名(同样可以修改哦)
最重要的是:
makemigrations或者
sqlmigrate命令,都不会在目标数据库自动执行,也就是SQL语句有了,但是还没有执行。这是为什么呢?因为毕竟自动的东西不一定满足需要~我们简单修改一下SQL然后执行,这样更加符合实际开发哦
当然,如果不需要修改SQL,直接执行的话,运行
python3 manage.py migrate命令就可以将改动应用到数据库了
3.4. 使用模型对象的API操作
在命令行通过
shell启动应用,就可以直接进行python根据模型应用提供的API接口的访问测试了
执行如下命令:
python3 manage.py shell
就可以在命令行中,进行API的测试了
D:\resp_work\PY_WORK\mysite>python3 manage.py shell Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> Question.objects.all() Traceback (most recent call last): File "<console>", line 1, in <module> NameError: name 'Question' is not defined >>> >>> from polls.models import Question, Choice >>> Question.objects.all()# 查看所有的问题对象列表 <QuerySet []> >>> >>> from django.utils import timezone # 引入时区模块 >>> q = Question(question_text="What's new?", pub_date=timezone.now())# 创建一个问题对象 >>> q.save() # 保存到数据库 >>> q.id # 查看q对象的主键字段 1 >>> q.question_text# 查看q对象的问题描述字段 "What's new?" >>> q.pub_date # 查看q对象的发布时间字段 datetime.datetime(2017, 6, 9, 2, 59, 43, 68178, tzinfo=<UTC>) >>> >>> q.question_text="What's up?" # 修改q对象的question_text属性值 >>> q.save()# 保存 >>> >>> Question.objects.all() #查看所有的问题对象列表 <QuerySet [<Question: Question object>]> >>>
未完待续:5.3. 后台管理系统http://www.jianshu.com/p/5a9634c3e833
Django来敲门
相关文章推荐
- Django来敲门~第一部分【5.1.项目配置settings.py详解】
- Django来敲门~第一部分【6.1 视图函数】
- Django来敲门~第一部分【4. 创建第一个模块应用】
- Django来敲门~第一部分【5.3.后台管理模块】
- Django来敲门~第一部分【6.2 HTML视图模板】
- The Django Book【第5章 与数据库交互:模型】
- Django中的模型与数据库(Models and database)
- Django --- 从已有数据库生成模型 (model)
- django官方文档——模型与数据库
- Django 模型高级部分及聚集查询
- [Django实战] 第9篇 - 表单、视图、模型、模板的交互
- The Definitive Guide To Django 2 学习笔记(九) 第五章 模型 (一)数据库访问
- python django 与数据库的交互
- Django与数据库交互
- 翻译www.djangobook.com之第五章:与数据库交互:模型
- Java EE 7 教程 第一部分 简介 第1章 概述 第1.2节 Java EE 应用模型
- [Django实战] 第9篇 - 表单、视图、模型、模板的交互
- django-evolution 插件维持Django 模型和数据库结构一致的基本原理
- 认识django2.0读书笔记(5)---第五章 模型(django数据库层)
- Django tutorial(3) 【翻译】编写第一个Django app,第三部分——玩转模型层的API