本篇文章要点:
1.如何通过分布式路由方法避免主路由文件的urlpatterns过于臃肿?
2.使用ORM框架代替数据库的操作?
1. Django的分布式路由实现
创建应用
应用在django项目中是一个独立的业务模块,可以包含自己的路由、视图、模版和模型;例如在大型网站中会有音乐、新闻、体育各个频道,这每一个都可以做成一个应用。
基本步骤:
- 创建应用文件夹:python3 manage.py startapp 应用名
- 注册:settings.py中INSTALLED_APPS配置项添加应用名
在创建的应用文件夹下可以看到以下内容:
- migrations 同步迁移文件
- __init__.py 初始化文件
- admin 管理后台,models 模型层入口
- tests 测试模块
- views 视图模块
配置分布路由
什么是分布式路由?
- 主路由配置文件可以不处理用户具体路由,只做请求的分发(分布式请求处理),具体的请求可以由各自的应用进行处理。
配置方法:主路由中调用include函数
include()函数 |
---|
语法:include(‘app名称.url模块名‘) |
作用:用于当前路由转到各个应用的配置文件的urlpatterns进行分布式处理 |
引用:from django.urls import include |
如图:
urlpatterns = [
path('admin/', admin.site.urls),
# http://127.0.0.1:8000/news/index
path('news/', include('news.urls')),
]
然后在应用文件下views.py文件,写入如下内容:
from django.http import HttpResponse
# Create your views here.
def index_view(request):
return HttpResponse('这里是新闻频道···')
最后做好应用文件下的urls.py路径映射:
from django.urls import path
from . import views
urlpatterns = [
path('index', views.index_view),
]
就可以看到如下结果:
配置应用下模版层templates
根据分布式路由的想法,django也提供了在不同应用下创建templates模版文件夹,来实现不同应用加载不同模版。
- 在应用下创建templates文件夹
- settings.py中templates配置项可以看到 'APP_DIRS': True(允许使用应用下模版)
但需要注意内外模版重名的问题,有如下规则:
- 当内外层模版层中有同名的模版时会优先使用外层的
- 当应用之间出现同名时,会按照install_apps配置下的应用顺序逐层查找。
当您想让多个应用下模版重名时,可以在(应用名/tamplates)文件夹下再创建一个文件夹,把同名模版文件放入其中。
2. 模型层及ORM介绍
模型层就是django中负责与数据库进行通信,在了解ORM框架之前,先对django配置mysql
django配置mysql:
- 先确认ubuntu是否安装python3-dev和default-libysqlclient-dev
- sudo apt list --installed|grep -E 'libysqlclient-dev|python3-dev'
- 没有时先安装缺少的文件:sudo apt-get install python3-dev default-libmysqlclient-dev
- 然后安装mysqlclient: sudo pip3 install mysqlclient
- 最后检查安装:sudo pip3 freeze|grep -i 'mysql'下必须有mysqlclient
数据库的配置:
1.settings.py 中配置项DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 指定数据库存储引擎
'NAME': 'mysite1',
'USER':'root',
'PASSWORD':'123456',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
2. terminal中登录mysql
mysql -uroot -p
sql>create database mysite1 default charset utf8;
ORM框架基础
什么是模型?
一个python类,他是由django.db.models.Model派生出的子类
- 一个模型类代表数据库中的一张数据表
- 模型类中的每一个类属性都代表数据库中的一个字段
- 模型是数据交互的接口,是表示和操作数据库的方法和方式。
ORM框架简介:
ORM框架叫做对象关系映射
- 作用:避免通过SQL语句操作数据库
- 映射关系:类-数据表,对象-数据行,属性-字段。
实现应用下数据库
1.创建应用bookstore,注册应用,在应用中的models.py文件下写入Book类:
#models.py/bookstore
from django.db import models
class Book(models.Model):
title = models.CharField('书名', max_length=50, default='')
price = models.DecimalField('价格', max_digits=7,
decimal_places=2)
2.数据库迁移:
迁移:django同步对模型的更改到数据库模式的方式
- 生成迁移文件 - python3 manage.py makemigrations - 应用下models.py生成一个中间文件保存在migrations文件下
- 执行迁移脚本程序- python3 manage.py migrate-将每个应用下的migraitons目录中的中间文件同步会数据库
注意,在第一次使用数据库迁移时会同步django本身自带的表被同步
在企业大型项目开发时,可能会出现数据库的迁移文件混乱,解决方案如下:
- 删除所有migrations所有的文件但保留__init__.py
- sql>drop database 数据库;
- 常规方式再重新初始化
3.查看表:
use mysite1;
show tables;
desc bookstore_book;(会看到django自动生成一个主键)
创建成功:
3.ORM-基础字段
常用的字段类型
字段类型 | 对应mysql中的类型 | 解释 |
---|---|---|
BooleanField() | tinyint(1) | 数据库中1,0表示 |
CharField() | varchar() | 必须指定max_length参数值 |
DateField() | date 表示日期 | 参数auto_now()=True当前时间,auto_now_add第一次会设置-default=‘2022-1-18’ |
DateTimeField() | datetime(6) | 参数同上 |
FloatField | double | 无 |
DecimalField() | decimal(x,y)使用小数 | 参数max_digits的位数>=decimal_places(小数点后的数字数量 ), 必须给定以上参数 |
EmailField() | varchar() | 更新值时,会有正则的检查 |
InterField() | int | 无 |
ImageField() | varchar(100) | 在数据库中为了保存图片的存储路径 |
TextField() | longtext | 表示不定长的字符数据 |
更改bookstore模式
需求:为bookstore表 添加一个名为info的字段 varchar(100)
- info = models.CharField('描述', max_length=100,default='')
- 再migrations和migrate一下
4.ORM-选项&Meta类
基本字段选项
字段选项:指定创建列的额外信息
primary_key | =True设为主键,没有该字段时django自动创建一个id主键,=False时就不会指定 |
blank | =True时字段可以为空,控制后台的 |
null | =True ,默认为False |
default | 设置所在列的默认值,当null=False时建议添加(新增字段时必须给) |
db_index | =True ,该列创建索引 |
unique | =True,值唯一 |
db_column | 指定列的字段名,不指定会采用属性名为列名 |
verbose_name | 设置此字段在admin界面上的显示名称 |
模型类-Meta类
基本格式:
from django.db import models
class 模型类名(models.Model):
字段名 = models.字段类型(字段选项)
class Meta:
db_table = '重命名' # 修改当前模型类对应的表名
使用内部Meta类给模型赋予属性:
from django.db import models
class Book(models.Model):
title = models.CharField('书名', max_length=50, default='', unique=True)
pub = models.CharField('出版社', max_length=100, default='') #默认null=False
price = models.DecimalField('价格', max_digits=7, decimal_places=2)
info = models.CharField('描述', max_length=100,default='')
market_price = models.DecimalField('零售价',max_digits=7, decimal_places=2,default=0.0)
class Meta:
db_table = 'book'
class Author(models.Model):
name = models.CharField('姓名',max_length=11)
age = models.InterField('年龄', default=True)
email = models.EmailField('邮箱', null=True)
class Meta:
db_table = 'author'
除了修改数据表名称之外,在后续的admin管理后台中可以对站点管理中自定义模型类名称的单复数进行修改:
verbose_name = '单数名'
verbose_name_plural = '复数名'
5.ORM-创建数据
ORM框架可以使用其提供的方式实现数据库的增删改查功能。
什么是管理器对象?
每个继承models.Model的模型类,都会有一个objects对象被同样继承下来,这个对象就是管理器对象。
如何在已有的数据库模式上提交数据?
使用django shell,它能够在交互模式用项目工程的代码执行相应的操作,每次启动时(Python3 manage.py shell)都会把项目当前环境模拟一次,所以项目代码发生改变时,需要重新进入。
django shell 下提交数据的两种方式:
b1 = Book.objects.create(title='Python',pub='xx出版社',price=20,marke_price=25)
b2 = Book(title='Django',pub='xx出版社',price=70,market_price=100)
b2.save()
数据创建结果如下: