Django框架学习--4--分布式路由&ORM基础

本篇文章要点:

1.如何通过分布式路由方法避免主路由文件的urlpatterns过于臃肿

2.使用ORM框架代替数据库的操作

1. Django的分布式路由实现

创建应用

        应用在django项目中是一个独立的业务模块,可以包含自己的路由、视图、模版和模型;例如在大型网站中会有音乐、新闻、体育各个频道,这每一个都可以做成一个应用。

基本步骤:

  1. 创建应用文件夹:python3 manage.py startapp 应用名
  2. 注册: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),
]

就可以看到如下结果:

Django框架学习--4--分布式路由&ORM基础_第1张图片

 配置应用下模版层templates

        根据分布式路由的想法,django也提供了在不同应用下创建templates模版文件夹,来实现不同应用加载不同模版

  •  在应用下创建templates文件夹
  • settings.py中templates配置项可以看到 'APP_DIRS': True(允许使用应用下模版)

但需要注意内外模版重名的问题,有如下规则:

  • 当内外层模版层中有同名的模版时会优先使用外层的
  • 当应用之间出现同名时,会按照install_apps配置下的应用顺序逐层查找。

当您想让多个应用下模版重名时,可以在(应用名/tamplates)文件夹下再创建一个文件夹,把同名模版文件放入其中。


2. 模型层及ORM介绍 

        模型层就是django中负责与数据库进行通信,在了解ORM框架之前,先对django配置mysql

django配置mysql:

  1. 先确认ubuntu是否安装python3-dev和default-libysqlclient-dev
  2. sudo apt list --installed|grep -E 'libysqlclient-dev|python3-dev'
  3. 没有时先安装缺少的文件:sudo apt-get install python3-dev default-libmysqlclient-dev
  4. 然后安装mysqlclient: sudo pip3 install mysqlclient
  5. 最后检查安装: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同步对模型的更改到数据库模式的方式

  1. 生成迁移文件 - python3 manage.py makemigrations - 应用下models.py生成一个中间文件保存在migrations文件下
  2. 执行迁移脚本程序- python3 manage.py migrate-将每个应用下的migraitons目录中的中间文件同步会数据库

注意,在第一次使用数据库迁移时会同步django本身自带的表被同步

在企业大型项目开发时,可能会出现数据库的迁移文件混乱,解决方案如下:

  1. 删除所有migrations所有的文件但保留__init__.py
  2. sql>drop database 数据库;
  3. 常规方式再重新初始化

3.查看表:

use mysite1;
show tables; 
desc bookstore_book;(会看到django自动生成一个主键)

创建成功: Django框架学习--4--分布式路由&ORM基础_第2张图片


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()     

数据创建结果如下:

Django框架学习--4--分布式路由&ORM基础_第3张图片

你可能感兴趣的:(python,Web,django,python,后端)