django新手教程(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: django新手教程(二)

创建一个应用

创建一个名为firstApp的应用,要先进入项目目录下,在cmd命令行输入

python manage.py startapp firstApp

project项目目录下如果出现一个名为firstApp包,则说明应用创建成功。

可以在项目所在路径命令行输入‘tree /F’查看目录层级,此时整个项目的目录层级为:

b77d70fc08b93a637592331ec03de215.png

注册应用

新创建的应用要进行注册才可以用。

把我们新定义的firstApp加到项目同名目录下的settings.py中的INSTALL_APPS中。把应用的名称写入 ,记得用引号包裹,逗号隔开。

cec91213d753c005343a46ebaf2953c4.png

什么是视图?

MTV中的V表示的是View,视图函数(或简称视图)只是一个Python函数,它接受Web请求并返回Web响应。

此响应可以是网页的HTML内容,重定向,404错误,XML文档或图像。视图本身包含返回该响应所需的任何任意逻辑。

该代码可以存在于你想要的任何地方,只要它在Python路径上即可。

为了将代码放在某处,惯例是将视图放在一个名为views.py的文件中,该文件位于项目或应用程序目录中。

编写第一个视图

打开 firstApp/view.py,把下面这些 Python 代码输入进去:

from django.http import HttpResponse    
def index(request):    
    return HttpResponse("Hello, world !")

其中,request参数是用来接收请求报文的,导入HttpResponse对象,用来向客户端返回数据。

如果想看见效果,我们需要将一个 URL 映射到它——这就是我们需要 URLconf 的原因了。

为了创建 URLconf,请在firstApp目录里新建一个 urls.py 文件。

路由的使用

firstApp/urls.py(没有这个文件就在应用目录下创建urls.py文件,这是子路由)中,输入如下代码:

#子路由
from django.urls import path,re_path
from firstApp import views
urlpatterns = [
    re_path('', views.index, name='index'),    # re_path可以使用正则匹配视图,相当于Django1版本的url
    #...  其他的路由规则
]

下一步是要在根 URLconf 文件中指定我们创建的firstApp模块。在project/urls.py (根路由)文件的 urlpatterns列表里插入一个 include(),添加分路由,把我们自己创建的urls.py与根路由关联,代码如下:

#根路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    path('admin/', admin.site.urls),    # path匹配的是字符串
    path('', include(('firstApp.urls','app'),namespace='app')),    # namespace是命名空间
    #...  其他的路由规则
]

函数 include( )允许引用其它 URLconfs。每当Django遇到include()(来自django.conf.urls.include())时,它会去掉URL中匹配的部分并将剩下的字符串发送给include的URLconf做进一步处理,也就是转发到二级路由去。

此时用你的浏览器访问 http://localhost:8000,你将能够看见 "Hello, world!" ,这是你在index视图中定义的。

958e359fc37501cec7d4b72763f028e7.png

Django1.x 与Django2.x中url与path的区别

Django2.x版本

Django2.x中的路由匹配视图官方推荐用path,path不支持正则匹配,直接匹配相同字符串。与url相比要去掉r、^和$等正则匹配。

#在使用namespace时需要在include中加入app_name,也就是下面的firstApp

#根路由
from django.contrib import admin
from django.urls import path,include,re_path    # path的导入方式
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(('firstApp.urls','firstApp'),namespace='firstApp')),

Django1.x 版本

Django1.x 中路由匹配视图使用url,使用正则匹配。在Django2.x中可使用re_path替换url,其他不变。

#在使用namespace时不需要加入app_name

#根路由
from django.conf.urls import url,include    # url导入方式
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^',include(('firstApp.urls'),namespace="firstApp")),
]

在本教程中路由统一采用re_path正则匹配的方式。

什么是模型?

模型(Model)是MTV中的M。模型一般在应用目录下的models.py进行操作。

模型是数据唯一而且准确的信息来源。它包含你正在储存的数据的重要字段和行为。一般来说,每一个模型都映射一个数据库表。

记住:

每个模型都是一个 Python 的类,这些类继承 django.db.models.Model

模型类的每个属性都相当于一个数据库的字段。

综上所述,Django 将给你一个自动生成访问数据库的 API。

web项目的数据一般都存在数据库(database)中,模型与数据库的交互是通过ORM完成。

ORM

ORM是“对象-关系-映射”的简称。

它是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。

429a1017655b2aa2baabd92a8ee49e6e.png

ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。这使软件开发人员专注于业务逻辑的处理,提高了开发效率。

3a5167377d280c8ec931d8a39040b443.png

创建模型

现在我们定义一个名为Person的样例模型,并且有first_name和last_name属性。

在应用目录下firstApp/models.py中输入:

from django.db import models
class Person(models.Model):
    first_name=models.CharField(max_length=30)
    last_name=models.CharField(max_length=30)
    class Meta:
        db_table="person"

其中类名首字母应当大写。模型继承django.db.models.Model。

first_name 和  last_name是模型的字段。

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

CharField表示定义的字段类型为字符串。

max_length表示字段的最大长度。

db_table='person’是定义模型类在数据库中生成的表单的名字。

以上的 Person 模型能创建一个数据库表,如下:

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

数据库的配置

通常,这个配置文件使用 SQLite 作为默认数据库。如果你不熟悉数据库,或者只是想尝试下 Django,这是最简单的选择。

Python 内置 SQLite,所以你无需安装额外东西来使用它。

本课程使用的是MySQL数据库,如果使用默认数据库无需进行下面更改。

用pip安装mysqlclient,mysqlclient是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。

pip install mysqlclient

注意:在Django2中使用pymysql可以会版本报错,所以最好使用mysqlclient。

安装完,打开 project/setttings.py这是个包含了 Django 项目设置的 Python 模块。找到DATABASES对其进行配置。

d2830dd85373908685e12c02c5f0d99b.png

其中MySQL的默认端口号为3306,如果是本机的数据库,HOST填入:127.0.0.1。

如此操作,数据库的基本配置就完成了。

数据迁移

创建完模型后,我们需要找到项目目录(manage.py所在的目录),生成一个迁移文件,在命令行输入:

python manage.py makemigrations

生成迁移文件之后,执行迁移文件,请使用下面的指令:

python manage.py migrate

执行完迁移,数据库中会根据模型中类和属性生成对应的表。

 

模型属性(objects)

objects是类的一个属性。

objects是Manager类型的对象,用于与数据库进行交互,称之为管理器对象。

当定义的模型没有指定管理器对象,系统会默认创建一个名为objects的属性作为管理器对象。

objects也可自定义:

首先,自定义一个继承models.Manager的管理类,代码中重写get_queryset方法对数据进行了过滤。代码如下:

class StudentManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(isDelete=False)

然后,自定义管理器对象:

books=StudentManager()

一旦自定义管理器对象,默认的objects就不再自动生成。可以用自定义的管理器对象替它。

objects一般是通过‘类名.objects ’的方法使用

创建对象

创建对象就是根据模型中定义的类创建一个实例对象,这个对象拥有实际的属性值。

当创建对象时,Django不会与数据库进行交互,调用save()方法时才与数据库进行交互,将对象保存到数据库中。

创建对象的方法有多种,最简单的方法是在类中自定义一个类方法创建对象。定义一个create类方法具体代码如下:

class Student(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField()
    @classmethod    #类方法
    def create(cls, name, age):
        return cls(name=name,age=age)
    class Meta:
        db_table="student"

类方法的定义要在函数的上方添加@classmethod,类方法把类当做第一个参数传给cls,后面的参数就是类的属性的形参,最后返回的把参数赋值给类属性。

创建对象一般在视图函数中,利用类方法创建一个名为小明,年龄为10的实例对象,代码如下:

name="小明"
age="10"
s3 = Student.create(name,age)
s3.save()

执行save()才能保存到数据库。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
前端开发 JavaScript BI
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
使用echarts和highcharts图表库实现折线图、柱状图、饼图和数据集图
161 2
|
6月前
|
存储 安全 网络协议
Python 教程之 Django(9)对模型中的字段进行验证
Python 教程之 Django(9)对模型中的字段进行验证
59 0
Python 教程之 Django(9)对模型中的字段进行验证
|
6月前
|
API 数据库 Python
Python 教程之 Django(8)在 Django 管理界面中渲染模型
Python 教程之 Django(8)在 Django 管理界面中渲染模型
47 0
Python 教程之 Django(8)在 Django 管理界面中渲染模型
|
6月前
|
SQL 前端开发 JavaScript
Python 教程之 Django(10)模板
Python 教程之 Django(10)模板
63 0
|
6月前
|
SQL 存储 API
Python 教程之 Django(7)Django 模型
Python 教程之 Django(7)Django 模型
80 1
Python 教程之 Django(7)Django 模型
|
3月前
|
前端开发 JavaScript 数据库
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
|
3月前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
|
3月前
|
Linux Shell 数据库
python Django教程 之 安装、基本命令、视图与网站
python Django教程 之 安装、基本命令、视图与网站
|
5月前
|
SQL 前端开发 关系型数据库
28. Python Web 编程:Django 基础教程
28. Python Web 编程:Django 基础教程
48 2
|
6月前
|
存储 中间件 数据安全/隐私保护
Django教程第3章 | Web开发实战-登录
登录案例、Djiango中间件【2月更文挑战第23天】
125 2
Django教程第3章 | Web开发实战-登录