创建一个应用
创建一个名为firstApp的应用,要先进入项目目录下,在cmd命令行输入
python manage.py startapp firstApp
project项目目录下如果出现一个名为firstApp包,则说明应用创建成功。
可以在项目所在路径命令行输入‘tree /F’查看目录层级,此时整个项目的目录层级为:
注册应用
新创建的应用要进行注册才可以用。
把我们新定义的firstApp加到项目同名目录下的settings.py中的INSTALL_APPS中。把应用的名称写入 ,记得用引号包裹,逗号隔开。
什么是视图?
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视图中定义的。
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解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。这使软件开发人员专注于业务逻辑的处理,提高了开发效率。
创建模型
现在我们定义一个名为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对其进行配置。
其中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()才能保存到数据库。