SharEDITor

从0到1搭建个人网站 三-数据库与model

全栈技术 从0到1搭建个人网站 发表于 2017-07-12 15:19:02 阅读1580次


如果希望不改源码就能添加和修改网站的内容,这时我们需要数据库来做数据存储,本节介绍下如何通过简单几步来链接数据库实现方便的增删改查

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

创建和链接数据库

首先,我们需要有一个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对数据库做读写