从0到1搭建个人网站 三-数据库与 model
创建和链接数据库
首先,我们需要有一个mysql的服务,你可以选择自己安装启动一个mysql服务,我选择了阿里云的云数据库RDS(和本地搭建没有区别,收费但不贵),我创建了一个数据库名叫db_shareditor(如果本地搭建的mysql,执行命令是create database db_shareditor)
下面我们配置我们的网站工程来连接这个数据库,修改shareditor/settings.py里的DATABASE改成如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_shareditor',
'USER': 'username',
'PASSWORD': 'password',
'HOST': 'hostip',
'PORT': '3306',
'OPTIONS': {
'sql_mode': 'traditional',
}
}
}
这里的USER、PASSWORD、HOST、PORT都配置成你自己的,然后我们来检测一下数据库配置是否正确
[lichuang@localhost:~/Developer/shareditor $] python manage.py check
System check identified no issues (0 silenced).
看到这样的信息说明我们的配置没有问题,否则会抛出异常,这时我们根据异常信息再追查问题
创建model并自动生成数据库表
这里解释一下什么是model,model就是数据库表在内存里的数据结构,比如某个数据库表有A和B两个字段,那么它对应的model一般也会写成A和B两个成员,这样我们在代码里操作model的实例就是在操作数据库
每个model的设计都需要精心打磨,我们首先创建一个BlogPost的model,修改web/models.py,增加如下类定义:
class BlogPost(models.Model):
title = models.CharField(max_length=255, verbose_name='文章标题')
body = models.TextField(verbose_name='文章内容')
create_time = models.DateTimeField(verbose_name='创建时间')
这个类实际上定义了一个数据库的结构,下面我们用django工具来自动根据这个结构定义生成对应的数据库表,执行:
python manage.py migrate
这时我们再看一下数据库多出了这些数据库表
auth_group
auth_group_permissions
auth_permission
auth_user
auth_user_groups
auth_user_user_permission
django_admin_log
django_content_type
django_migrations
django_session
这里比较奇怪的是怎么多出了这么一批数据而没有找到我们的blogpost呢?这是因为settings.py里的INSTALLED_APPS默认安装了一些其他的玩意,而并没有安装我们的web这款app,好,那现在我们暂时先保留默认安装的app(以后有用),把我们的web添加进去,如下:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes'
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'web',
]
现在我们重新生成migrate文件并创建数据库表,执行:
python manage.py makemigrations
python manage.py migrate
这时再看数据库表多出了web_blogpost(django会自动用app名字小写加下划线加model名的小写来作为数据库表的名字,实际上数据库表名我们也是可以自己来配置的,感兴趣自己google一下吧)
创建有关联关系的数据库表
我们的每篇文章都会有一个类别(subject,如大数据、全栈技术等),每个类别会对应多篇文章,也就是1对多的关系,那么我们可以利用django的models里的外键类型来关联,如下:
class Subject(models.Model):
name = models.CharField(max_length=255, verbose_name='类别名称')
introduce = models.CharField(max_length=255, verbose_name='类别简介')
image = models.ImageField(verbose_name='类别图片')
class BlogPost(models.Model):
title = models.CharField(max_length=255, verbose_name='文章标题')
body = models.TextField(verbose_name='文章内容')
create_time = models.DateTimeField(verbose_name='创建时间')
subject = models.ForeignKey(Subject, verbose_name='类别', null=True)
我们重新执行:
python manage.py makemigrations
python manage.py migrate
这时再看数据库表多出了web_subject,同时web_blogpost也自动多出了一个subject_id字段
有人问了,这用不用外键有什么关系呢,手工写好一个subject_id字段,然后在代码逻辑里就把这个字段作为查询subject表的key不就行了吗?看来该是介绍IDE的时候了,我来给大家介绍一款棒棒的开发工具PyCharm,具体安装方法自己去百度,我现在装的是PyCharm 2017.1.4版本,记得一定要配置好Project Interpreter为系统里安装好django的那个python环境
下面见证奇迹的时刻到了,用PyCharm打开我们上面的shareditor工程,并打开views.py文件,我们来编辑如下一段代码:
我的天啊!好强大有木有!当我们输入几个字母前缀的时候,它会把我们用外键关联的类的各种方法都给我们列出来,再也不用苦逼的查文档了
创建多对多关系的数据库表
我们的每篇文章都会有多个标签(tag, 如:从0到1搭建个人网站、自己动手做聊天机器人等),每个标签会对应多篇文章,也就是多对多的关系,那么我们可以利用django的models里的ManyToMany类型来关联,我们添加Tag类如下:
class Tag(models.Model):
name = models.CharField(max_length=255, verbose_name='标签名称')
并为BlogPost类添加如下成员:
tags = models.ManyToManyField(Tag, verbose_name='标签')
我们重新执行:
python manage.py makemigrations
python manage.py migrate
这时再看数据库表多出了web_tag和web_blogpost_tag两个表,这里的web_blogpost_tag实际上是一个关系表,也就是说,BlogPost类多了tags成员,但web_blogpost表里并没有多任何字段,但当我们在PyCharm中输入tags前缀的时候依然会看到相关提示
总结
这一节我们介绍了数据库表和model之间的关系,以及一对多、多对多关系的使用,下一节我们来继续讨论利用model对数据库做读写