Django 的组成结构与模型设计

举报
宇宙之一粟 发表于 2022/10/30 16:53:24 2022/10/30
【摘要】 回顾在上一篇文章中,我们介绍了如何安装 Django,然后通过命令行创建一个 Django 项目和 Django 应用,并对项目结构中的文件进行了初步的解释,可能大家还有很多迷糊的地方。不过没关系,我认为慢慢通过练习可以加深我们对这些结构和文件的理解。今天,我们就能通过一个小小的练习–动手创建 Hello World 服务器,用到上一章中部分 Django 项目默认创建的文件,赶紧学起来吧...

image.png

回顾

在上一篇文章中,我们介绍了如何安装 Django,然后通过命令行创建一个 Django 项目和 Django 应用,并对项目结构中的文件进行了初步的解释,可能大家还有很多迷糊的地方。不过没关系,我认为慢慢通过练习可以加深我们对这些结构和文件的理解。

今天,我们就能通过一个小小的练习–动手创建 Hello World 服务器,用到上一章中部分 Django 项目默认创建的文件,赶紧学起来吧。

在我们进入本章动手练习之前,再熟悉熟悉 Django 的组成结构。

Django 的组成结构

Django 是遵循 MVC 架构的 Web 开发框架,关于 MVC 框架的知识(大家可以自行了解,经常会被面试官提到),其主要由以下几个部分组成。

  • 管理工具(Management):一套内置的创建站点、迁移数据、维护静态文件的命令工具。
  • 模型(Models):提供数据访问接口和模块,包括数据字段、元数据、数据关系等的定义和操作。
  • 视图(Views):Django 的视图层封装了 HTTP Request 和 Response 的一系列操作和数据流,其主要功能包括 URL 映射机制、绑定模板等。
  • 模板(Template):是一套 Django 自己的页面渲染模板语言,用若干内置的 tags 和 filters 定义页面的生成方式。
  • 表单(Form):通过内置的数据类型和控件生成 HTML 表单。
  • 管理站(Admin):通过声明需要管理的 Model,快速生成后台数据管理网站。

引用菜鸟教程:MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
  • View(视图) - 视图代表模型包含的数据的可视化。
  • Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离

大致对 Django 的组成结构了解之后,再接下来的笔记中,我们将花费时间和练习逐个学习 Django 这些模块。

Hello World 网站

在上一章我们讲到 Django 项目和应用的创建后,现在让我们来写我们的第一个视图(views),也就是创建第一个简单的 Hello World 网站,通过这个方法我们能够大致了解 Django 的路由映射功能。

  1. 首先在 mysite/myapp/views.py 中建立一个路由相应函数:
from django.shortcuts import render
from django.http import HttpResponse    # 新增

# Create your views here.
def welcome(request):
    return HttpResponse("<h1>Hello World! </h1>")

该代码定义了一个函数 welcome,简单返回一条被 HttpResponse()函数封装的 Welcome 信息。

  1. 接下来,要通过 URL 映射将用户的 HTTP 访问与该函数绑定起来。
    在 mysite/myapp/ 目录中新建一个 urls.py 文件,管理应用 myapp 中的所有 URL 映射:

在这里插入图片描述
写入代码如下:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'', views.welcome, name='first-url')
]
  • 第 1 行代码引入 django.conf.urls 中的 url() 函数,Django 中的所有路由映射由该函数生成。

  • 第 2 行代码引入了 mysite/myapp/views.py 模块。

  • 第 3 行代码定义了关键变量 urlpatterns,该变量是一个列表,保存所有由 url() 函数生成的路由映射,即,把所有路由映射到 views.pywelcome 函数中,并把该映射命名为 first-url

  1. 在项目 URL 文件 mysite/urls.py 的 urlpatterns 中增加一项,声明对应用中 myapp 中 urls.py 文件的引用,代码如下:
from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include  # 新增

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^myapp/', include('myapp.urls')),   # 新增
]

首先通过 import 语句引入 django.conf.urls.include() 函数,然后通过在 urlpatterns 列表中增加一个路径 myapp/,将其转接到 myapp.urls 包,即 mysite/myapp/urls.py 文件。这样,就能通过 include() 函数就将两个 urlpatterns 连接了起来。

  1. 这样之后,我们来看看会发生什么:
python manage.py runserver

然后用 Chrome(或者其他 Web 浏览器),打开 http://127.0.0.1:8000/myapp 这个链接,我们可以看到如下效果:

在这里插入图片描述

恭喜你!你刚刚完成了你的第一个 Django 视图 – Hello World(毕竟这是每一个初学者必过的一关了吧。)

模型本质

现在,我们来学习模型,Django 模型层是 Django 框架自定义的一套独特的 ORM(Object Relational Mapping,关系映射模型)技术。

模型本质上就是数据库表的布局,再附加一些元数据。模型包含了你要在数据库中创建的字段信息及对数据表的一些操作。

基本操作

想要操作模型,我们先来了解 Django 模型层的大概。使用 Django 模型开发的首要任务就是定义模型类及其属性,每个模型的物理存在方式就是一个 Python 的类 Class,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,而类中的每个属性被映射为数据表中的一列字段。

可能你还是很懵逼,没关系,我们从伪代码中再来看看这些概念。

  1. 模型类定义

模型定义的基本结构如下:

from django.db import models

class ModelName(models.Model):
    field1 = models.XXField(...)
    fiels2 = models.XXField(...)
    ...
    class Meta:
        db_table = ...
        other metas = ...

解析如下:

  • 所有 Django 模型都是 django.db.models.Model 类的子类。每个类都会被转换为数据库表
  • 通过其中的类属性定义模型字段,模型字段必须是某种 models.XXField 类型,比如 CharField,DateTimeField 等等,而这些就会被转换为对应数据库表中的列
  • 通过模型类中的 Meta 子类定义模型元数据,比如数据库表名、数据默认排序方式等。

我们来详细看一个样例:

定义了一个 Person, 其拥有 first_name 和 last_name:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

first_namelast_name 是模型的字段。每个字段都被指定为一个类属性,并且每个属性映射为一个数据库列。

上面的 Person 模型会创建一个如下的数据库表:

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

我们介绍一下 class Meta 中的那些属性,Meta 类的属性名由 Django 预定义,我们无需自己创建,Model 元数据就是 “不是一个字段的任何数据” – 比如排序选项,常见的 Meta 类属性汇总如下:

  • abstract: True or False,标识本类是否为抽象基类
  • app_label: 定义本类所属的应用,比如 app_labels = ‘myapp’
  • db_table:映射的数据表名,比如 db_table=‘db_blogs’
  • default_related_name:定义本模型的反向关系引用名称,默认与模型名一致。
  • ordering:本模型记录的默认排序字段,可以设置多个字段,默认以升序排列,如果降序需要在字段前加“负号”。

比如,按文章发布时间降序显示:

class Meta:
        ordering = ("-publish_date", )   # 按照publish字段值的倒序显示
  • 还有很多其他的选项,我们暂时先不列出,有兴趣的可以自行查看 Django 文档 Model Meta options ,先混个眼熟,等项目中具体用到我们再添加。

上诉只是简单列出一些能用到的 Meta 选项。我们需要注意的使:没有一个选项是必需的,是否添加 class Meta 到你的 model 完全是可选的。

2. 普通字段类型

普通字段类型是指模型类中除外键关系外的数据字段类型。数据字段为 Django 使用模型时提供如下信息:

  • 在数据库中用什么类型定义模型字段,比如 INTEGER、VARCHAR 等。
  • 用什么样的 HTML 标签显示模型字段,比如 <input type="radio"> 等。
  • 需要什么样的 HTML 表单数据验证。

所有的数据字段的属性必须继承自抽象类 django.db.models.Field,我们可以使用 Django 预定义的一系列 Field 子类,也可以自己定义继承该类的字段类型。

  • AutoField:一个自动递增的整型字段,添加记录时它会自动增长。AutoField 字段通常用于数据表的主键;如果模型中没有指定主键字段,则 Django 会自动添加一个 AutoField 字段。
  • BigIntegerField:64 位整型字段
  • CharField:字符串字段,用于较短的字符串,相对应的 HTML 标签是单行输入框 <input type="text">
  • TextField:大容量文本字段,相对应的 HTML 标签是多行编辑框 <textarea>
  • 更多字段类型,参见官方 Model field reference

3. 常用的字段参数

每个字段类型都有一些特定的 HTML 标签和表单验证参数,比如 height_field、path 等。

  • primary_key 参数:设置一个模型的主键字段,为 True 或 False
from django.db import models

class Person(models.Model):
    id = models.AutoField(primary_key=True)
  • null:定义是否允许相对应的数据库字段为 Null,默认设置为 False
  • blank:如果为 True,则该字段允许为空白。默认值为 False

请注意,这个字段与 null 有所不同。null 与数据库完全相关,是数据库的飞空约束;而 blank 与表单验证相关。如果字段包含 blank=True,则表单验证将允许输入一个空值。

  • choices:定义字段的可选值,本字段的值应该是一个包含二维元素的元组,第一个元素是实际存储的值,第二个元素是 HTML 页面中显示给我们看的名称,我们之后的项目会用到这一字段。例如:
from django.db import models

LEVLES = (
    ('1', 'Very Good'),
    ('2', 'Good'),
    ('3', 'Normal'),
    ('4', 'Bad'),
)

class Comment(models.Model):
    id = models.AutoField(primary_key=True)
    levels = models.CharField(max_length=1, choices=LEVELS)
  • help_text:HTML 页面中输入控件的帮助字符串
  • unique:如果为 True,代码此字段在整个表中是唯一的。

总结

本文学习了如何建立 Django 项目和添加应用,并以此开始了我们的第一个 Django 项目,创建了我们的初始应用程序。

本文也介绍 Django 的模型的基本结构、字段类型、字段参数,其实 Django 远远不止这些字段。现在很多我们用不上,没关系,等需要用到的时候我们再查看官方文档。

希望本文能对你有所帮助,如果喜欢本文,可以点个关注。

这里是宇宙之一粟,下一篇文章见!

宇宙古今无有穷期,一生不过须臾,当思奋争。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。