linRichielinRichie
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
前端
Python
Linux
ChatGPT
  • B 站
  • 500px
    • Python学习指南
  • 快速开始

    • Python: 输入与输出 (I/O)
    • Python: 异常处理 try-except
    • Python: List深入概述
    • Python: 面向对象编程(OOP)
  • Python 语法库函数

    • 语法库目录
    • 库

      • library目录
      • argparse:解析命令行参数
      • difflib:比较序列并生成差异信息
      • dnspython: DNS处理库
      • IPy:IP地址处理库
      • logging:记录和管理日志信息
      • os:访问和操作操作系统
      • psutil:系统性能信息库
      • re:正则表达式库
      • smtplib:邮件发送库
    • 函数

      • function目录
      • any() 函数
      • input 函数
      • lambda 和 map 函数
      • reversed()函数
      • zip()函数
    • 语句

      • statement目录
      • import 语句
      • Try/Exception 异常
    • 概念

      • concept目录
      • 深拷贝与浅拷贝
      • 列表、字典与元组
      • 文件读写
      • IO: 输入与输出
      • 逻辑判断与条件语句
      • OOP 面向对象:class
      • OOP: 面向对象编程
  • SQLAlchemy

    • 获取insert或者update的id
  • Pandas

    • Pandas目录
    • Pandas:基础操作
    • Pandas:数据处理与转换
    • Pandas: 数据写入 excel 表格
  • Python前端框架

    • Flask

      • 1. Flask简介
      • 2. Flask程序基本结构
      • 3. Flask请求-响应循环
      • 4. flask案例: 框架网页查询IP
      • Python: Flask中的GitHub OAuth
    • Django

      • chapter-01:Django框架认识

        • 1.1 Django的产生背景
        • 1.2 MTV设计模式
        • 1.3 Django 主要功能模块
      • chapter-02:开发环境配置

        • 2.1 Python的安装与配置
        • 2.2 虚拟环境安装与配置
        • 2.3 Django安装与配置
        • 2.4 MySQL安装配置
      • chapter-03:项目框架搭建

        • 3.1 Django管理工具-创建项目骨架
        • 3.2 修改项目的默认配置
        • 3.3 初始化项目环境
      • chapter-04:ORM应用与原理剖析

        • 4.1 构建POST应用需要的数据集
        • 4.2 Model相关的概念和使用方法
        • 4.3 Model的查询操作API
        • 4.4 ORM实现原理
      • chapter-05:Django管理后台

        • 5.1 将Model注册到管理后台
        • 5.2 管理后台实现原理
      • chapter-06:视图

        • 6.1 视图基础
        • 6.2 视图的高级特性和快捷方法
        • 6.3 基于类的通用视图
      • chapter-07:模板系统

        • 7.1 模板系统基础
        • 7.2 模板语言
      • chapter-08:表单系统

        • 8.2 使用表单系统实现表单: ModelForm
      • chapter-09:用户认证系统

        • 9.1 用户与身份认证
        • 9.2 权限管理
        • 9.3 用户认证系统应用
      • chapter-10:Django路由系统

        • 10.1 路由系统基础
      • chapter-11:Django中间件

        • 11.1 中间件基础
  • Python例子

    • Python: Linux的Shell命令
    • Python: PEP8自动格式化代码
    • Python: pip操作
    • Python: 业务服务监控
    • Python: 从文件逐行读取数据
    • 将链表转换为字符串
    • Python: 检查URL是否能正常访问
    • Python: 爬取网易云音乐
    • Python: 读取目录下的所有内容
    • 案例研究:文本统计
  • Python爬虫

    • 数据解析工具:Xpath
  • 算法题

    • 02:两数相加
    • 09:回文数
    • 13:罗马数值转换为整数
    • 14:最长公共前缀

4.1 构建POST应用需要的数据集

  • 4.1 构建POST应用需要的数据集
    • 4.1.1 post应用的Models定义
    • 4.1.2 post应用完成数据库迁移

4.1.1 post应用的Models定义

本项目中post的功能

  • 用户在BBS站内发表话题,称为:Topic
  • 可以针对每一个Topic发表评论,称为:Comment
  • 可以对每一个Comment支持或者反对

由于每一个数据表对应一个Model定义,每一个Model都是一个Python类,所以Model之间是可以继承的

  • Django规定:所有的Model都必须继承自django.db.models.Model.

  • 可以直接继承,或者间接及成果

  • Model中的所有字段都是django.db.models.Field的子类

  • Django会根据Field的类型确定数据库表的字段类型

  • Django内置了数十种Field字段类型,不同的类型支持的参数不一定相同

    • 但名字,帮助文本,唯一性等参数都是通用的
  • 在post应用的models.py文件中定义抽象的Model基类:

    from django.db import models
    
    # Create your models here.
    class BaseModel(models.Model):
        """
        post 应用中的Model 基类
        """
    
        class Meta:
            abstract = True
            ordering = ['-created_time']
        created_time = models.DateTimeField(auto_now_add=True,help_text=u'创建时间')
        last_modified = models.DateTimeField(auto_now=True,help_text=u'修改时间')
        def __str__(self):
            raise NotImplementedError
    
    • 代码解析
    • 定义了两个类属性create_time和last_modified,都是DateTimeField类型,继承自BaseModel的类自动拥有这两个属性
    • 定义的两个类属性用到了三个Field参数:
      • auto_now_add: 用于将首次创建对象时间设置为当前时间
      • auto_now:用于将每次保存对象时间设置为当前时间
      • help_text:解释性的帮助文本
    • 定义了抽象方法__str__,继承自BaseModel的类必须实现这个方法,作用是:能够优化打印Model实例的样式
    • 内部类Meta
      • abstract:声明了这个是抽象类,不能是实例化,表现为BaseModel不会创建数据表
      • ordering:声明了排序的规则
      • created_time:代表按照创建时间正序排列,负号标识按照创建时间逆序排序
    • BaseModel定义了两个DateTimeField类型的相关字段,会根据不同的数据存储后端选择对应的数据库字段类型
  • BaseModel直接继承自django.db.models.Model,所以,Topic和Comment可以继承自BaseModel,从而实现间接继承

    • Topic

      class Topic(BaseModel):
          """
          BBS论坛发布的话题  
          """
          title = models.CharField(max_length=255, unique=True, help_text='话题标题')
          content = models.TextField(help_text='话题内容')
          is_online = models.BooleanField(default=True,help_text='话题是否在线')
          user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text='关联用户表')
          def __str__(self):
              return '%s: %s' % (self.id, self.title[0:20])
      
      • 外键引用的User字段:ForeignKey
      • ForeignKey:是Django内置的应用 django.contrib.auth中定义的Model,之前创建超级用户也是直接使用的这个类型
    • Comment

      class Comment(BaseModel):
          """
          BBS 话题评论
          """
          content = models.CharField(max_length=255, help_text='话题评论')
          topic = models.ForeignKey(to=Topic,to_field='id',on_delete='models.CASCADE', help_text='关联话题表')
          up = models.IntegerField(default=0, help_text='支持')
          down = models.IntegerField(default=0, help_text='反对')
          def __str__(self):
              return '%d: %s' % (self.id, self.content[0:20])
      

4.1.2 post应用完成数据库迁移

  • 编写了post应用的Model定义,为实现这些Models对象的操作,需要使用manage.py提供的数据库迁移工具将Models对象映射为数据库中的表
  • 在执行迁移命令前,需要把post应用加载到my_bbs项目中,在INSTALLED_APPS的第一行加入:post.apps.PostConfig
  • 然后对post应用执行makemigrations命令,会在post/migrations包下面生成迁移文件,命令:python manage.py makemigrations post
  • 迁移文件也是Python文件,可以利用manage.py提供的sqlmigrate命令打印迁移文件执行的SQL语句:python manage.py sqlmigrate post 0001
    • sqlmigrate命令后面跟随应用名称和迁移文件的名称
  • manage.py提供了更为简单的命令帮助用户检查项目中的问题,可以在manage.py所在的目录下执行
    • python manage.py check
    • check命令也不会影响数据库
    • 没有问题,会看到控制台上打印输出:System checkidentified no issues(0 silenced)
  • 查看了SQL语句,验证了项目的正确性,就可以执行migrate命令将Models映射为数据库的表了
    • python manage.py migrate
  • 由于在刚才的定义中,Topic和Comment没有显示指定表名,默认使用Django的规则:应用名_小写类名
最近更新时间:
Next
4.2 Model相关的概念和使用方法