Django必知必会(二)文档模版和ORM模型

在这里插入图片描述

Django必知必会系列文章 前文链接:Django必知必会(一)相关配置及动态URL

一、Django模版相关(HTML文档)

  1. 直接在视图函数中编写HTML肯定是一个错误的选择这样会讲Python代码和前端代码混在一起,工作效率会很低,Django在MVT设计模式中其中的 “T” 就是关于将Python代码和前端代码分开设计的,那么接下来就要涉及到模版引擎相关的知识了

    1. 什么是模版引擎?

      • 模版引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生产特定格式的文档,用于网站的模版引擎就会生标准文档(HTML)简单来讲,就是将业务数据渲染到模版文件里,将模版文件和数据通过模版引擎生成HTML文档
    2. Django常用模版引擎有哪些?

      • Jinja2:jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用。使用前需要配置,配置方式如下

        TEMPLATES = [
            {
                'BACKEND': 'django.template.backends.jinja2.Jinja2',  # jinja2模板引擎
                'DIRS': [os.path.join(BASE_DIR, 'templates')],
                'APP_DIRS': True,
                'OPTIONS': {
                    'context_processors': [
                        'django.template.context_processors.debug',
                        'django.template.context_processors.request',
                        'django.contrib.auth.context_processors.auth',
                        'django.contrib.messages.context_processors.messages',
                    ],
                    # 补充Jinja2模板引擎环境
                    'environment': 'utils.jinja2_env.jinja2_environment',
                },
            },
        ]
        
        # django引擎环境代码,注意配置路径已经文件名 jinja2_env.py
        from django.contrib.staticfiles.storage import staticfiles_storage
        from django.urls import reverse
        from jinja2 import Environment
        
        
        def jinja2_environment(**options):
            env = Environment(**options)
            env.globals.update({
                'static': staticfiles_storage.url,
                'url': reverse,
            })
            return env
        
      • DTL(Django Templates Language):DTL是Django自带的模版引擎,使用时直接导入即可使用

        from django.template import Template
        
    3. Django中的 render() 函数

      • 当一个请求发送到Django中时,往往要做的就是加载模版、查询数据、填充上下文,返回HttpResponse对象,这个过程是一个比较常见的任务,所以DJango尽可能的去优化让它变得简单所以就有了 render() 函数 from django.shortcuts import render 一行代码就可以将渲染好的模版返回给用户,但是你首先需要在模版文件中(HTML) 提前编写好模版语法按照对应的变量名去传递参数,模版引擎语法在这里不多描述,下面是一个模版渲染的示例代码:
      render(request, "index/index.html", {"username": username1, "rank_news": new})
      

二、Django模型(数据库交互)

  1. Django数据层:现代Web应用而言,视图逻辑经常需要与数据库进行交互。在数据库驱动型网站中,网站连接数据库服务器,从中检索数据,然后在网页中把数据显示出来,或者需要用户来填充数据。接下来将介绍Django的数据层。既:MVT 中的“M” 数据模型。

  2. 为什么需要数据模型?Python中有交互数据库的模块叫PyMySQL它可以实现使用Python在MySQL中实现增删改查,用过它的朋友应该都知道,使用它前需要建立连接、创建游标、执行语句、关闭连接,如果直接使用它的话,代码会很冗余,如果不使用MySQL使用那么数据库交互的代码几乎要改一大半,这简直是无法想象的事情!这些问题Django已经为我们解决,数据库连接参数是硬编码的。理想的做法是,把这些参数存储在 Django 配置中,数据交互就需要了解另外一个知识:ORM(对象—关系映射)

  3. ORM介绍:Object-Relation Mapping 中文意思是对象—关系映射,在MVC/MVT设计模式中的Model都包括它。ORM的优势在于只需要面向对象编程,对数据库的操作都转化成对类属性和方法的操作,实现了数据模型与数据库解耦,屏蔽了不同数据库操作上的差异(不再关心使用的是MySQL还是PostgreSQL);ORM的劣势:相比于直接使用SQL语句操作数据库,有性能损失,根据对象的操作转化成SQL语句,根据查询的结果转化为对象,在映射过程中可能会有性能损失。

  4. Django使用模型:刚才介绍了ORM的概念,在Djangp中通过模型在背后执行SQL语句,返回便利的Python数据结构,表示数据库表中的行。Django 还通过模型表示 SQL 无法处理的高层级概念。接下来介绍如何定义一个模型:

    1. 配置数据库:Django中默认使用的数据库是 sqlite3 如果要使用其它数据库需要修改 DATABASES 里面的配置,下面是配置MySQL数据库的方法:

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
              'HOST': '127.0.0.1',  # 数据库主机
              'PORT': 3306,  # 数据库端口
              'USER': 'root',  # 数据库用户名
              'PASSWORD': 'xxxxxx',  # 数据库用户密码
              'NAME': 'xxx'  # 数据库名字
          },
      }
      

      Django ORM封装了PyMySQL所以还需要在 init 添加下面两行代码引入PyMySQL,如果是PostgreSQL 的话则需要配置 psycopg2 模块

      import pymysql
      
      pymysql.install_as_MySQLdb()
      
    2. 编写数据模型:Django模型需要在app应用中的 models.py 继承 django.db.models 进行编写,models中的属性在这里不多介绍了,下图是一个数据模型示例:

      class New(models.Model):
          new_cate = models.ForeignKey(Cate, related_name="类别")  # 所属类别
          new_time = models.CharField(max_length=100, verbose_name="发布时间")
          new_seenum = models.IntegerField(verbose_name="浏览次数", default=0)
          new_disnum = models.IntegerField(verbose_name="跟帖次数", default=0)
          index_image_url = models.CharField(max_length=200, verbose_name="新闻列表图片路径", default='SOME STRING')
          # related_name定义主表对象查询子表时使用的方法名称
          new_title = models.CharField(blank=False, max_length=100, verbose_name="标题")
          new_source = models.TextField(verbose_name="新闻来源", max_length=20, blank=False, default="Fantasy News")
          digest = models.CharField(max_length=500, default='SOME STRING')  # 新闻摘要
          new_content = models.TextField(blank=False, verbose_name="新闻内容")
      
          def __str__(self):
              return self.new_title
      
          class Meta:
              db_table = 'new'
              verbose_name_plural = "新闻信息表"
      
    3. 创建数据模型:使用Python编写好数据模型类后就可以使用数据库迁移命令Django将根据编写的数据库模型类,创建数据表,这个过程中我们常常需要下面4个命令:

      • python manage.py check 运行后DJango将检查框架,即验证 Django 项目的一系列静态检查;如果你的模型或者其它地方有问题,Django会将错误输出。
      • python manage.py makemigrations xxx 应用的名字,如果没有指定将自动检测哪些应用中的模型被修改,然后生成迁移文件;Django将数据库中的改动都存储在了migrations文件夹中,运行命令后会自动生成 0001_initial.py 这样的文件。
      • python manage.py migrate 会根据 makemigrations 生成的迁移文件中的改动更新到数据库中,所以使用 migrate 前需要先使用makemigrations是生成迁移文件。
      • python manage.py sqlmigrate 应用名 迁移文件编号 使用它可以将迁移文件中的改动输出对应的SQL语句
    4. 模型与数据库的交互:增、删、改、查都有对应的方法操作,不多描述。

后记:ORM模型虽然很方便,但站在SQL优化的角度去看,它只能满足一些符合逻辑、合法、基本的索引查询,无论是多么复杂的ORM工具,在精妙和复杂的索引面前都是“浮云”。所以熟练使用工具的情况下我们还需要理解底层原理。

猜你喜欢

转载自blog.csdn.net/qq_42768234/article/details/105273207