第 59 天:Python Django 模型概述与应用

今天来为大家介绍 Django 框架的模型部分,模型是真实数据的简单明确的描述,它包含了储存的数据所必要的字段和行为,Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,它们会自动从模型生成。

Django 模型

Django 中模型是真实数据的简单明确的描述,它包含了储存的数据所必要的字段和行为,在创建模型前需要先配置好数据库。Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle等,Django 为这些数据库提供了统一的调用 API。我们可以根据自己业务需求选择不同的数据库。

数据库配置

Python 内置 SQLite,所以你无需安装额外东西来使用它,在 TestProject 项目目录下,打开 TestProject/settings.py 配置文件, 已经配置了 SQLite 作为默认数据库。当然如果在真实项目中,我们可以换一个更具扩展性的数据库,如Mysql等。具体配置操作如下:

# TestProject/settings.py
# DatabaseDATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}

配置说明:

  • ENGINE:数据库驱动,可选('django.db.backends.sqlite3','django.db.backends.postgresql','django.db.backends.mysql',或 'django.db.backends.oracle')
  • NAME:数据库的名称(这里使用的SQLite对应的是一个数据库文件路径)
  • USER:数据库登陆用户名
  • PASSWORD:数据库登陆密码
  • HOST:数据库所在主机连接地址(可以是域名或IP地址)
  • PORT:数据库所在主机服务端口号

创建模型

还是以我们之前创建的投票应用为基础,在这个应用中创建两个模型--Question和Choice。

  • Question(问题)中包含提问的内容和发布的时间两个字段。
  • Choice(选项)中包含针对问题的选项以及已投票数,每个问题可以有多个选项。

下面我们将以上模型描述通过编辑 polls/models.py 文件定义出来。

# polls/models.py
from django.db import models

class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('发布日期')

class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)

这里有以下几点需要注意:

  1. 每个模型被定义为 django.db.models.Model 类的子类。
  2. 每个模型有一些类变量,它们都表示模型里的一个数据库字段。
  3. 每个字段都是 Field 类的实例,如 CharField 对应数据库中的字符串字段。
  4. 每个 Field 类实例变量的名字也是字段名,如 question_text,定义时需要遵循数据库字段规则。
  5. 实例变量的名字可以定义备注名,方便代码理解,如 pub_date = models.DateTimeField('发布日期')。
  6. 某些 Field 类实例定义时需要参数,还有一些可选参数,对应数据库表结构,如 CharField 类需要定义长度max_length。
  7. 使用 ForeignKey 可以定义表外键关联,如本例中用 ForeignKey 定义了每个 Choice 都要关联到一个 Question 对象上。

激活模型

通过配置上面 models.py 类中创建模型的代码,已经足够 Django 为我们创建数据库和相应表结构了,现在我们将 polls 应用安装到我们 TestProject 项目中。首先再次打开 TestProject/settings.py 配置文件,在配置类 INSTALLED_APPS 中添加 polls 应用的点式路径 'polls.apps.PollsConfig',配置完成如下所示:

# TestProject/settings.py
INSTALLED_APPS = [ 'polls.apps.PollsConfig', #新增polls路径 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles',]

因为 PollsConfig 类写在文件 polls/apps.py 中,所以它的点式路径是 'polls.apps.PollsConfig'

保存配置并退出,然后运行 makemigrations 命令, Django 会检测你对模型文件的修改,并且把修改的部分储存为一次迁移(迁移是 Django 对于模型定义即你的数据库结构的变化的储存形式)。

$ python manage.py makemigrations pollsMigrations for 'polls': polls/migrations/0001_initial.py - Create model Question - Create model Choice

执行成功后,就可以再执行 migrate 命令,将你在模型中定义的数据库修改同步到应用的数据库表结构上,执行结果如下:

$ python manage.py migrateOperations to perform: Apply all migrations: pollsRunning migrations: Applying polls.0001_initial... OK

数据库迁移操作被分解成生成和应用两个命令是为了让你能够在代码控制系统上提交迁移数据并使其能在多个应用里使用;这不仅仅会让开发更加简单,也给别的开发者和生产环境中的使用带来方便。

模型操作

对模型对象的操作,本质上就是数据库数据的操作。下面我们就通过对模型对象操作实现对数据库记录基本的CURD操作。

新增数据

编辑 TestProject 项目下polls/views.py 文件代码,通过访问URL 在 Question 模型对应表中添加数据。

# polls/views.pyfrom django.shortcuts import render
# Create your views here.from django.http import HttpResponsefrom polls.models import Choice, Questionfrom django.utils import timezone
def index(request): return HttpResponse("你好,这是一个投票页面。")
# 增加问题描述信息def add(request): question = Question(question_text='双十一你在哪个平台剁手?',pub_date=timezone.now()) question.save(); return HttpResponse("新增投票成功!")

再编辑 polls/urls.py 文件代码,新增一条 add 的路由,代码如下:

# polls/urls.pyfrom django.urls import pathfrom . import views
urlpatterns = [ path('', views.index, name='index'), path('add', views.add, name='add'), #新增add路由]

保存后,通过 python manage.py runserver 127.0.0.1:8080 命令启动本地开发服务器,启动后在浏览器中输入URL地址 http://127.0.0.1:8080/polls/add ,会返回如下页面表示新增数据成功。

接下来我们再刷新下页面,这样就会再增加一条数据,然后我们把这两条记录查出来。

查询数据

Django 提供了多种方式来查询出数据库记录,如查询上面 Question 模型对应全部数据,某个id的数据以及通过多条件过滤得到所需要的数据。依然编辑 TestProject项目下 polls/views.py 文件,增加查询对应代码:

# polls/views.py# …… 省略部分代码
def query(request): # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM question questionList = Question.objects.all() # 获取单个对象 response2 = Question.objects.get(id=1) # 相当于SQL中的WHERE id=1,可设置条件过滤 response3 = Question.objects.filter(id=1) #根据id字段排序 response5 = Question.objects.order_by("id")
res = "" # 遍历所有对象 for q in questionList: res += str(q.id) + "." + q.question_text + " <br />" return HttpResponse("查询所有问题:<br />" + res)

再编辑 polls/urls.py 文件代码,新增一条 query 的路由,代码如下:

# polls/urls.pyfrom django.urls import pathfrom . import views
urlpatterns = [ path('', views.index, name='index'), path('add', views.add, name='add'), path('query', views.query, name='query'), #新增的query路由]

然后再浏览器中输入 URL http://127.0.0.1:8080/polls/query ,看到如下图所求请求结果:

可以看到出现两条一样的记录,但是 id不同,不过这正符合我们的预期,下面我们将对第一条数据进行修改和删除。

修改数据和删除

修改和删除数据可以操作一条或多条记录,这取决于你的查询条件,再次编辑 TestProject 项目下 polls/views.py 文件,增加修改和删除对应代码:

# polls/views.py# …… 省略部分代码
#修改数据def update(request): question1 = Question.objects.get(id=1) question1.question_text = '天猫和京东你会选哪个?' question1.save()
# 通过条件过滤的方式也可以更新一条或多条数据 # Question.objects.filter(id=1).update(question_text='天猫和京东你会选哪个?')
return HttpResponse("更新id=1:" + question1.question_text)
#删除数据def delete(request): question2 = Question.objects.get(id=2) question2.delete()
# 通过条件过滤的方式也可以删除一条或多条数据 # Question.objects.filter(id=2).delete()
# 删除所有数据 # Question.objects.all().delete()
res3 = '' questionList = Question.objects.all() # 遍历所有对象 for q in questionList: res3 += str(q.id) + "." + q.question_text + " <br />" return HttpResponse("删除后查询:<br />" + res3)

再编辑 polls/urls.py 文件代码,新增一条 query 的路由,代码如下:

# polls/urls.pyfrom django.urls import pathfrom . import views
urlpatterns = [ path('', views.index, name='index'), path('add', views.add, name='add'), path('query', views.query, name='query'), path('update', views.update, name='update'), # 新增update路由 path('del', views.delete, name='del'), # 新增del路由]

完成以上代码配置,我们就可以通过访问 URLhttp://127.0.0.1:8080/polls/update 实现第一条数据的更新操作,请求后返回页面如下:

这样我们就把第一条数据的问题描述更新了,再次通过 URL http://127.0.0.1:8080/polls/query 查询下所有数据,可以看到返回页面如下:

好,更新成功后,我们再试下删除数据了,通过查看删除相关代码是把 id 为2的数据删除了,这次我们访问的 URL http://127.0.0.1:8080/polls/del,然后返回删除后再次查询所有记录的页面,如下图:

可以看到只剩下一条数据,说明我们已经删除成功了。

总结

本文为大家介绍了 Django 的模型,通过上面学习我们了解到模型功能的强大,为我们基于数据库的开发节省了大量工作量。Django还有模板,表单,路由,认证,基本的数据库管理等等内建功能,接下来将进一步的介绍 Django 提供的其他功能。

参考

  • Django 中文文档:https://docs.djangoproject.com/zh-hans/2.2/
  • Django W3C介绍:https://www.w3cschool.cn/django/

示例代码:https://github.com/JustDoPython/python-100-day

系列文章

第 58 天:Python Web开发 Django 简介

第 57 天:Python 用户登录 Flask-Login

第 56 天:Python 爬虫之 urllib 包基本使用

第55天:爬虫介绍

第54天:Python 多线程 Event

第53天:Python 线程池

第52天:Python multiprocessing 模块

第51天:Python Queue 入门

第0-50天:从0学习Python 0-50合集

(0)

相关推荐

  • Django 实战3

    Django 实战3

  • Python做一个属于自己的web网站「下」

    原创 AI悦创 AI悦创 1周前 你好,我是悦创.昨天写了一篇:Python 做一个属于自己的web网站「上」,但有点小 bug ,什么 bug 呢?待会就说.开头这张图确实有点丑,不过奈何没办法,没 ...

  • 思维模型No.59|系统设计之IPO模型(大辉改进版)

    有一个经典的IPO模型,用来解释系统的底层原理.这是系统思考和系统设计的一个重要模型. 我参考相关资料,做了点改进,示意如图. 其中: I--Inputs(输入),可以是数据,人力或物质等 P--Pr ...

  • Python Django框架有什么优势?功能介绍

    Python Django框架是一款全能框架,内置许多模块,极大方便了web开发者,同时它也被称之为Python最重要的框架.那么为什么Django框架很重要呢?我们来看看吧. Django是Pyth ...

  • 多值选择模型概述

    一.导论分类数据是关于被解释变量的数据,被解释变量数据可以归结为多种互斥数据中的一种.例:考试成绩的评价:优秀.良好.中等.差.身体状况:极好.正常.差.被解释变量的类型多余两种,我们称之为多值或者多 ...

  • Python Django框架优缺点有哪些?

    众所周知,Python有很多框架,Django就是其中之一,知名度高.应用广泛,是一款全能型框架,内置许多模块,极大的方便了Web开发,那么你知道Django框架有哪些优缺点吗?下文为大家详细介绍一下 ...

  • Python Django和Flask框架哪个好?

    众所周知,Django.Flask.Tornado是非常受欢迎的三大Web开发框架,Django大而全.flask小而精.Tornado性能高.那么你知道它们之间的区别吗?我们来看看详细的对比介绍吧. ...

  • Django 模型类ForeignKey 选项参数

    https://blog.csdn.net/hpu_yly_bj/article/details/78939748 to_fields  被关联字段用于关联的字段,默认情况下,Django使用被关联对 ...

  • 前端教程:Django模型

    创建模型 下面是创建一个 Dreamreal 模型实例 − from django.db import models class Dreamreal(models.Model): website = ...

  • Python 里最强的Web框架,早就不是Django和Flask了

    Python 里最强的Web框架,早就不是Django和Flask了

  • 59思维模型:全范围领导模型一王者归来

    作者:老范 一个优秀的公司离不开一位优秀的领导者,如果让你列举一位卓越的领导者,你会选择谁?每个人可能有不同的选择?有人可能选择史蒂夫·乔布斯.有人可能选择杰夫·贝索斯.或者有人会选择杰克·韦尔奇.这 ...