本篇文章要点:
1.如何通过分布式路由方法避免主路由文件的urlpatterns过于臃肿?
2.使用ORM框架代替数据库的操作?
应用在django项目中是一个独立的业务模块,可以包含自己的路由、视图、模版和模型;例如在大型网站中会有音乐、新闻、体育各个频道,这每一个都可以做成一个应用。
基本步骤:
在创建的应用文件夹下可以看到以下内容:
什么是分布式路由?
配置方法:主路由中调用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),
]
就可以看到如下结果:
根据分布式路由的想法,django也提供了在不同应用下创建templates模版文件夹,来实现不同应用加载不同模版。
但需要注意内外模版重名的问题,有如下规则:
当您想让多个应用下模版重名时,可以在(应用名/tamplates)文件夹下再创建一个文件夹,把同名模版文件放入其中。
模型层就是django中负责与数据库进行通信,在了解ORM框架之前,先对django配置mysql
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;
一个python类,他是由django.db.models.Model派生出的子类
ORM框架叫做对象关系映射
#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)
迁移:django同步对模型的更改到数据库模式的方式
注意,在第一次使用数据库迁移时会同步django本身自带的表被同步
在企业大型项目开发时,可能会出现数据库的迁移文件混乱,解决方案如下:
use mysite1;
show tables;
desc bookstore_book;(会看到django自动生成一个主键)
字段类型 | 对应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表 添加一个名为info的字段 varchar(100)
字段选项:指定创建列的额外信息
primary_key | =True设为主键,没有该字段时django自动创建一个id主键,=False时就不会指定 |
blank | =True时字段可以为空,控制后台的 |
null | =True ,默认为False |
default | 设置所在列的默认值,当null=False时建议添加(新增字段时必须给) |
db_index | =True ,该列创建索引 |
unique | =True,值唯一 |
db_column | 指定列的字段名,不指定会采用属性名为列名 |
verbose_name | 设置此字段在admin界面上的显示名称 |
基本格式:
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 = '复数名'
ORM框架可以使用其提供的方式实现数据库的增删改查功能。
每个继承models.Model的模型类,都会有一个objects对象被同样继承下来,这个对象就是管理器对象。
使用django shell,它能够在交互模式用项目工程的代码执行相应的操作,每次启动时(Python3 manage.py 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()