手把手教你跑通 Django

本文为 Django 学习总结,坑都帮你们踩过啦

运行环境

Windows 10;Pycharm Community Edition 2020.1.3;Django 3.0.8

Django 的安装十分简单,可以在 pycharm 中直接安装,也可以在 cmd 中使用 pip install 安装指定版本,这里不再重复。

创建项目

在合适位置创建目录,例如在 F:\pycharm\document\Django 路径下创建 01-sunck 文件夹,通过 cmd 终端切换到该文件夹下:

cd /d F:\pycharm\document\Django\01-sunck

随后执行以下命令创建一个 Django 工程

django-admin startproject project

在没有任何报错后,执行命令 tree . /F 可观察所创建的工程目录树状图如下:

└─project
    │  manage.py
    │
    └─project
            asgi.py
            settings.py
            urls.py
            wsgi.py
            __init__.py

至此,一个 Django 项目就创建好了。我们简单介绍一下创建出来的文件作用:

  • manage.py:是一个命令行工具,可以与 Django 项目进行交互
  • _init_.py:空文件,用来告诉 Python 这个目录是一个 Python 包
  • settings.py:项目配置文件
  • uris.py:项目的 URL 声明
  • wsgi.py:项目与 WSGI 兼容的 Web 服务器入口

配置数据库

如果没有数据库的基础知识,也并不妨碍我们对 Django 进行学习,在这里我们可以把数据库看作是存放数据的一张张表。为简单起见,我们直接使用 Python3 中内置的 sqlite3 数据库,其 settings.py 中的默认配置如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

创建应用

首先在 cmd 中进入刚才创建的 project 文件夹,执行命令:

python manage.py startapp myApp

startapp 为参数,myApp 为应用名称,随后我们就可以在文件夹下看到 myApp 了:

│  manage.py
│
├─myApp
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  └─migrations
│          __init__.py
│
└─project

我们对目录中几个比较常用的文件进行说明:

  • admin.py:站点配置
  • models:模型
  • views.py:视图

激活应用

在 pycharm 中打开 settings.py 文件,找到 INSTALLED_APPS 列表,在最后一行加入 'myApp'

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myApp'
]

定义模型

模型的实际上就是一个类,一个模型对应了一张表。我们打开 myApp 下的 models.py 文件,在其中引入 django.db 中的 models

from django.db import models

我们要创建的类需要对 models 进行继承:

class Grades(models.Model):
    gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    ggirlnum = models.IntegerField()
    gboynum = models.IntegerField()
    isDelete = models.BooleanField()

class Students(models.Model):
    sname = models.CharField(max_length=20)
    sgender = models.BooleanField()
    sage = models.IntegerField()
    scontend = models.CharField(max_length=20)
    isDelete = models.BooleanField()
    # 关联外键
    sgrade = models.ForeignKey("Grades", on_delete=models.CASCADE)

注意:如果你的 Django 版本比较高,最后一行外键定义时要加 on_delete=models.CASCADE,否则在后面迁移文件时会报错。

说明:我们不需要定义主键,主键在生成时会自动添加,并且值也为自动添加的(这一步的具体情况会在生成迁移文件中体现)

在数据库中生成数据表

生成迁移文件

打开 cmd,在 project 文件夹下执行以下命令,在 migrations 文件夹下生成迁移文件:

python manage.py makemigrations

我们可以看到在 migrations 文件夹下生成了名为 0001_initial.py 的迁移文件,其部分代码如下:

migrations.CreateModel(
    name='Students',
    fields=[
        ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
        ('sname', models.CharField(max_length=20)),
        ('sgender', models.BooleanField()),
        ('sage', models.IntegerField()),
        ('scontend', models.CharField(max_length=20)),
        ('isDelete', models.BooleanField()),
        ('sgrade', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='myApp.Grades')),
    ],
),

我们可以看到在迁移文件中,主键已经被自动添加。

执行迁移

执行以下命令执行迁移

python manage.py migrate

这时我们可以在 project 目录下(哪里有 db.sqlite3 文件就在哪里打开 cmd)通过命令 sqlite3 db.sqlite3 打开内置数据库,并通过命令 .schema 显示建表语句,查看添加到数据库的表项(翻到倒数第二项):

在这里插入图片描述

至此,我们已将 models.py 中写的两个模型添加至数据库中。

测试数据操作

进入到 python shell 并引入包

要对数据进行操作,我们首先要在 cmd 中 project 目录下执行命令 python manage.py shell 进入到 python shell 中。然后引入一些必要的包,因为我们要使用 Grades, Students 类,因此要将其对应的 models 引入,还需要引入一些方法和日期类:

>>>from myApp.models import Grades,Students
>>>from django.utils import timezone
>>>from datetime import *

按顺序输入后,若无报错则表明引入成功。

查询所有数据

我们可以通过 类名.objects.all() 语句查询一个类的所有数据。例如使用语句 Grades.objects.all() 来查询 Grades 中的所有数据。但因为此时我们还没有在数据库中存放数据,因此得到的结果为空

添加数据

添加数据的步骤也十分简单,我们需要在 shell 中实例化一个对象,进而将对象写入数据库。实例化对象的代码如下:

>>> grade1 = Grades()
>>> grade1.gname = "python04"
>>> grade1.gdate = datetime(year=2017,month=7,day=17)
>>> grade1.ggirlnum = 3
>>> grade1.gboynum = 70
# 注意:这里的isDelete一定要进行初始化,否则会报错。
>>> grade1.isDelete = False

这样就完成了对象的实例化,但是这还不够,我们只是实例化了对象,却没有将其保存到数据库中,如果我们此时查询数据库的数据,还会得到为空的结果,我们继续通过命令 gradel.save() 将对象保存到数据库中。此时我们查询数据库中的内容,可以得到如下结果:

>>> Grades.objects.all()
<QuerySet [<Grades: Grades object (1)>]>

如果我们想让数据库的数据按照我们期望的格式输出,而不是只输出 Grades object (1),我们需要在 models.py 中的 Grades 类最后一行加入以下代码:

def __str__(self):
    return "%s-%d-%d"%(self.gname, self.ggirlnum, self.gboynum)

但此时输出数据库内容,并不会按照我们期望的结果显示,我们还需要重新进入 shell,并且重新包含之前的 3 个库。

我们再输出数据库的内容,就可得到如下结果:

>>> Grades.objects.all()
<QuerySet [<Grades: python04-3-70>]>

同理,我们添加第二个对象:

>>> grade2 = Grades()
>>> grade2.gname = "python05"
>>> grade2.gdate = datetime(year=2017,month=7,day=18)
>>> grade2.ggirlnum = 1
>>> grade2.gboynum = 50
>>> grade2.isDelete = False
>>> grade2.save()

此时我们就可以在数据库中执行命令 select * from myApp_grades; 查询数据库保存的数据:
在这里插入图片描述

查询某个对象

此时我们如果在 cmd 中直接输入 grade1对第一个创建的对象进行查询,则会报错;但查询 grade2 不会报错,这是因为此时输出的 grade2 只是刚才创建的对象,并不是查询出来的。如果我们想要查询之前创建的对象,则需要使用以下命令:

>>> Grades.objects.all()
, ]>

# 类名.objects.get(pk=2)
>>> Grades.objects.get(pk=2)

其中 pk=2 中的 pk 表示主键,表示每行数据的唯一值,这里我们查询主键为 2,即第二个数据。

修改数据

修改数据十分简单,我们只需要对对象的成员进行修改,随后记得用 save 保存就行,否则数据库不会同步更新:

# 模型对象.属性 = 新值
>>> grade2.gboynum = 60
>>> grade2.save()

删除数据

删除数据也十分简单,可以直接使用 delete 命令物理删除(非逻辑删除)一个对象,此操作直接将数据库中的对象删除而无需进行 save

# 模型对象.delete()
>>> grade2.delete()
(1, {'myApp.Students': 0, 'myApp.Grades': 1})

此时数据库内容为:

在这里插入图片描述

关联对象

然后我们通过实例化一个 Students 类的对象,将其成员赋值为 Grades 类的对象实现关联对象:

>>> grade1 = Grades.objects.get(pk=1)
>>> stu = Students()
>>> stu.sname = "wtl_bupt"
>>> stu.sgender = True
>>> stu.sage = 20
>>> stu.scontend = "I'm Mike"
>>> stu.sgrade = grade1
>>> stu.isDelete = False
>>> stu.save()

查询数据库中得到结果:

sqlite> select * from myApp_students;
1|wtl_bupt|1|20|I'm Mike|0|1

接下来我们有更高的需求,我们如何获得关联对象的集合呢?例如我们想获取 python04 班级的所有学生:

# 创建一个新的学生对象并初始化
>>> stu1 = Students()
>>> stu1.sname = "cgx"
>>> stu1.sgender = True
>>> stu1.sage = 20
>>> stu1.scontend = "I'm cgx"
>>> stu1.sgrade = grade1
>>> stu1.isDelete = False
>>> stu1.save()

# 对象名.关联的类名小写_set.all()
>>> grade1.students_set.all()
<QuerySet [<Students: Students object (1)>, <Students: Students object (2)>]>

得到 python04 班级的人数为 2 人,如果我们重写 str 则可以进行格式化输出这两个人的信息。

为方便起见,我们还可以直接创建学生对象,属于 python04 班级:

# 注意:如果输入中文,需要用u解码
>>> stu3 = grade1.students_set.create(sname='wyz',sgender=True,scontend=u'我是吴彦祖',sage=40,isDelete=False)

此时不用进行 save 操作即可更新数据库:

sqlite> select * from myApp_students;
1|wtl_bupt|1|20|I'm Mike|0|1
2|cgx|1|20|I'm cgx|0|1
3|wyz|1|40|我是吴彦祖|0|1

启动服务器

接下来到了激动人心的时刻,我们写的代码可以在服务器上面运行啦!

在这里我们启动一个测试服务器,此服务器是一个纯 python 写的轻量级 web 服务器,仅在测试时使用。

我们使用命令 quit() 退出 shell 后,在 project 目录下执行启动服务器的命令:

# python manage.py runserver ip:port
# ip可以不写,默认为本机ip
# 端口号默认为8000
python manage.py runserver

手把手教你跑通 Django_第1张图片

其中 127.0.0.1 表示主机 ip。

我们在 google chrome 浏览器中输入网址 127.0.0.1:8000,可以看到服务器启动成功!

手把手教你跑通 Django_第2张图片
至此,我们就算是跑通了!!

你可能感兴趣的:(Django)