应用创建与数据库初始化

从这个小节开始,就会带大家一步步搭建一个简单的 Django 博客项目出来。整个项目大概有如下功能:用户注册/登录,发布文章,查看文章。在实现这些功能的过程中,会逐一介绍 Django 框架的基本特点与使用。

应用创建

首先,用 VSCode 打开之前创建好的hello项目。Django 这个框架是依托于应用的,一个 Django 项目是一个个应用所构成的。这里使用下面的命令创建第一个应用:

python manage.py startapp user

可以看到项目的根目录下多了一个user文件夹:

image-20220122214447228

这就是刚刚创建好的应用,之后会在这个应用中实现用户模块。

连接数据库

用之前介绍的 Datagrip,先连接上本项目的数据库。打开 Datagrip,选择数据源->Sqlite:

image-20220122214427786

名称随便填写,然后选中项目中的那个 sqlite 文件:

image-20220122214602587

然后就可以在左侧看到数据库了:

image-20220122214657473

下一步就是创建数据库表。

建表

这里默认大家已经掌握基本的数据库知识(主键,外键等)。

打开user/models.py,然后将其修改为如下内容:

from django.db import models

# Create your models here.

class User(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=20)
    password = models.CharField(max_length=50)
    email = models.EmailField(null=True, blank=True)
    post = models.IntegerField(default=0)

User就是我们新建的一个数据库表,同时它也是 Python 中的一个类。这个类中的每一个属性,都会对应表中的每一列。首先定义id为主键,其类型为AutoField,表示我们在初始化这个类时,不需要显式为其赋值,Django 会自动计算它的值。比如数据库中已经有了 3 个用户,在新建第四个用户时,id会被自动置为4。

然后是每个用户必备的用户名与密码类,通常这两个属性都不会很长,使用CharField类型储存,并设置最大长度。用户在注册时可以选择提供邮箱,存放于EmailField,也就是邮箱类中。考虑到可能有缺失的情况,所以允许这一个属性为空。最后一个post来记录这个用户一共发表了多少篇博客,其类型是整形IntegerField。在初始化时如果未被给出,则赋一个默认值 0 进去。

因为刚刚对数据库做了修改,我们需要将这些修改迁移进去。在命令行中输入以下两条命令:

python manage.py makemigrations
python manage.py migrate

发现没有反应。因为新建的应用没有写入到项目设置中。打开hello/settings.py,在这里把user这个应用写入:

image-20220123193241741

然后再执行上面的命令:

image-20220123193332980

Django 就会识别刚刚建好的表,并且把每个属性的信息写入。在 Datagrip 中刷新下对应的数据库,就可以在其中看到刚刚建好的表了:

image-20220123193529556

注:user_user是默认的应用名_表名的格式,并不是写法有问题。

到这里一个新的应用的初始化过程就已经结束了。相关代码已经提交到了 Github 的示例项目上,最后一次 commit 的注释为“Finish APP Create”。

注意事项

有关数据库的一切操作都要慎重。一个项目通常会在需求都非常明确之后,才确定要建哪些表、表之间有什么关系、表中都有哪些属性。如果需求不明确就随意建表,很容易在后期发现字段不够用,字段没用上,表太大过于臃肿需要拆分等情况,这时候再对表进行修改会麻烦很多。例如要在一个已有的表中加入一个新的字段,且这个表里已经有一部分数据的话,就需要允许这个新字段为空,或者指定默认值,不然加不进去。

这些对表的操作一个不慎就会产生很多脏数据,干扰正常的增删改查,最后只能删库处理。所以在建表时一定要慎重,少用外键(因为初学者再怎么被强调,自己上手开发或多或少都得改个十几次表,少用外键可以避免出现问题)。

参考资料

Django 支持的字段类型有很多,这里只对用到的类型做了简单介绍。如果有别的需求,可以查阅官方文档-模型字段参考

Copyright © Marvolo 2021 all right reserved,powered by Gitbook该文章修订时间: 2022-02-22 12:01:22

results matching ""

    No results matching ""