06_Web框架之Django三

Web框架之Django三

学习目标和内容

1、能够通过ORM模型创建数据表

2、能够通过ORM模型对数据进行操作

3、能够理解ORM模型对应关系

一、ORM概念

1、ORM介绍

==对象关系映射== 用于实现面向对象编程语言里不同类型系统数据之间的转换。

其就是==使用面向对象的方式==,==操作数据库进行表管理和增删改查操作==等。

2、ORM的作用和优点

Django中的对ORM进行封装,对接数据库引擎,执行对应的SQL语句。

使用者无需关心数据库引擎具体实现的软件(Mysql,sqlite......)。重点把握业务逻辑实现即可。之后如果数据库软件更换需要迁移,直接修改相关配置即可。

好处:

ORM使操作数据库变的更为简单、快捷。无需直接编写SQL语句,快速开发。

二、ORM建表

1、映射关系

在Django框架中,通过ORM模型进行数据库的管理和操作。

通过Python代码,Django的ORM模型将代码转为SQL语句,操作数据库。

以下为对应关系:

类名 ==== 表名

属性 ==== 字段

类实例对象 ==== 表记录

2、创建模型(表定义)

创建一个app03应用,模型代码的学习

①进入命令行

②执行创建新应用

创建一张表,只需在应用下的==model.py==中定义对应的类模型即可。==继承models.Model==。

常用的模型字段有哪些:

==CharField -> 字符串类型==

BooleanField -> 布尔类型

IntegerField -> 整数类型

DateField / DateTimeField -> 时间类型

EmailField -> Email类型

TextField -> 文本类型

更多类型参考:

Model field reference | Django documentation | Django

https://docs.djangoproject.com/en/1.11/ref/models/fields/#django.db.models.CharField

例:编写一个类模型

3、字段属性

字段属性,用来限定字段的最大长度,Null值,默认值,主键,唯一性,备注等信息。

(1)max_length

CharField需要max_length参数来指定VARCHAR数据库字段的大小。

(2)null

如果为True,Django 将用NULL来在数据库中存储空值。 默认值是 False。

(3)default

字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。

(4)primary_key

如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键,否则没必要设置任何一个字段的primary_key=True。

(5)unique

如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的。

(6)verbose_name

备注的名字,可读更好。

(7)choices

由元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。

更多属性参考:Model field reference | Django documentation | Django

根据提供的字段属性,设置合适的字段属性

4、模型元数据(可选)

模型元数据是“任何不是字段的数据”,比如排序选项(ordering),数据库表名(db_table)。在模型中添加class Meta是完全可选的,所有选项都不是必须的。

Meta选项参数:

(1)db_table

指定自定义数据库表名的。Django有一套默认的按照一定规则生成数据模型对应的数据库表名,如果你想使用自定义的表名,就通过这个属性指定。

若不提供该参数, Django 会使用 app_label + '_' + module_name 作为表的名字。当你通过db_table覆写表名称时,强烈推荐使用小写字母给表命名

(2)ordering

这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的

例如:

class Meta:

ordering = ['- name']

它是一个字符串的列表或元组。每个字符串是一个字段名,前面带有可选的“-”前缀表示倒序。前面没有“-”的字段表示正序。

(3)verbose_name

可读性更高的名字。可以认为是一个表名注释。

更多的元数据设置参考:Model Meta options | Django documentation | Django

5、迁移数据库(同步)

创建和迁移数据库表,一般执行两个步骤

①makegrations 根据类模型 创建迁移文件

②migrate 通过迁移文件,进行数据表的创建和修改操作(连接数据库,管理表)

Tip:

当模型初次创建和修改都需要执行

①进入操作命令行

②执行makegrations命令,创建迁移文件

Tip:如果遇到以下问题

需要在settings.py 配置

生成的migration迁移文件

③执行migrate迁移命令

以上操作就完成了Django中ORM模型。数据表的创建和修改已经完成。

问:Django连接数据库和数据表在哪里?表创建到哪儿了?

答:默认Django使用的sqlite数据库,sqlite是一个小型数据库,一个文件。

6、更换数据库

在Django框架中,默认提供了sqllite数据库,进行开发和调试。

实际业务环境中,可以选择为业务数据库,比如说MySQL

###6.1、windows安装mysql

①获取软件包

②解压并部署到一个目录

③配合环境变量

添加MySQL的安装路径bin目录下

配置环境变量后的效果

④安装并启动MySQL服务

对于服务安装和卸载,都是需要使用cmd的管理员模式,否则没有权限

右键启动服务

删除匿名用户(防止远程登录的问题)

以上完成了windows下MySQL服务器的部署

###6.2、Django配置使用MySQL

①修改settings.py配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',    #你的数据库名称 数据库需要自己提前建好
        'USER': '',   #你的数据库用户名
        'PASSWORD': '', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
        'OPTIONS': {
            "init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
        }
    }
}

②使用MySQL创建数据库

MySQL的数据库需要提前创建,注意字符编码,统一为uf8

CREATE DATABASE 库名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

③重新执行数据库迁移操作

cmd > pip install pymysql

在初始化文件中,导入mysql包

再次执行迁移,查看数据库表

简单查看数据表及其结构

Tip:MySQL严格模式

出现问题

mysql 数据校验的严格模式,相关MySQL的配置解决,可以自定查询解决。

这里提供的是在Django里配置的方式。

解决方案

三、ORM操作

Making queries | Django documentation | Django

1、添加数据

Django 使用一种直观的方式把数据库表中的数据表示成Python 对象:一个模型类代表数据库中的一个表,一个模型类的实例代表这个数据库表中的一条特定的记录。

使用关键字参数实例化模型实例来创建一个对象,然后调用==save()== 把它保存到数据库中。

也可以使用一条语句创建并保存一个对象,使用==create()==方法

定义url路由

在视图中导入模型类

(1)save

或者

(2)create

(3)create可以传入关键字参数kwargs

2、查询数据

(1)all方法

查询全部数据

Tip:模型类中定义返回的字段内容

(2)get方法

只取出一条数据,返回的是一个数据对象,如果查询的数据有多条或者没有都会抛出异常。

(3)==filter方法==

返回的是一个Queryset,即使只查出一条数据,也是一个Queryset。查询的数据没有也是一个空的Queryset。Queryset其实跟列表类似,列表的切片Queryset也可以使用。

(4)exclude方法

exclude 排除满足条件的,返回其他的

select * from hostlist where status != 1

(5)values方法

select * from hostlist

select hostname,ip from hostlist

values方法提供了,查询需要显示的字段筛选。

如果需要显示多个字段,可以使用以下写法

3、更新数据

(1)操作对象的方式更新

我们先找到我们需要更新的数据,然后直接调用属性更改,最后save保存就可以了。

(2)使用update的方式修改数据(推荐)

4、删除数据

使用delete方法删除数据

5、ORM内置查询字段

使用__关键查询字段 双下划线

contains “模糊”大小写敏感的包含指定字符串

icontains “模糊”大小写不敏感的包含指定字符串

startswith, endswith 以指字字符串开头或结尾

in 在给定的列表内

gt 大于

gte 大于或等于

lt 小于

lte 小于或等于

range 在指定范围内

四、ORM关联关系

运动会

一对一 一个运动员对应一个号码

多对一(一对多) 一个代表队可以被多个运动员申报

多对多 多个运动员可以报多个项目

1、多对一

多对一 就是一个对多个的关系。

比如:==一本书只能对应一个出版社,而一个出版社可以出版多本书==,这样就是==多对一的关系==。

多对一的关系,主要是通过主键和外键进行关联的。

在Django的ORM模型中,使用ForeignKey定义一对多的关系。

①创建模型一对多关系

创建模型后,同步数据生成数据表

查看创建的数据表结构

②多对一关系操作

添加数据 注意需要先添加一的关系,才能够添加多的关系。也就是此例中,先添加出版社,才可以添加图书。顺序和关联的先后,需要处理清楚。

先添加出版社信息

再添加图书信息

查询数据

通过书名称查询属于哪个出版社出版的 正向查询

通过出版社名称 查询出所有的该出版社出版的书籍 反向查询 对象实例_set

删除数据 删除出版社

当出版社删除后,对应的外键关系 图书也就跟着删除了 这是默认Django 多对一模型实现的

实际操作中:

如果在mysql中,图书属于某个出版社,这个出版社是不能够删除的

##2、多对多

比如:==一本书可以多个作者合作编写,一个作者也可以编写多本书==,这样就是==多对多的关系==。

在Django的ORM模型中,使用ManyToManyField定义一对多的关系。


操作方法

add(obj1, obj2, ...) #添加一指定的模型对象到关联的对象集中。 create(**kwargs) #创建一个新的对象,将它保存并放在关联的对象集中。返回新创建的对象。 remove(obj1, obj2, ...) #从关联的对象集中删除指定的模型对象。 clear() #从关联的对象集中删除所有的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/255466.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差,不利于在不同规模的数据集上有效运行若输入维度发生变化,需要修改并重新训练网络容易过拟合 全连接导致参数量特别多,容易过拟合如果增加更多层,参数量会翻倍无法有效利用局部特征 输入…

EnvoyFilter API

目录 原文链接 https://onedayxyy.cn/docs/EnvoyFilter-API 本节实战 实战名称🚩 实战:EnvoyFilter API-全局范围-2023.12.18(测试成功)🚩 实战:EnvoyFilter API-配置优先级-2023.12.18(测试成功)🚩 实战&#xff1a…

每日一题:LeetCode-LCR 016. 无重复字符的最长子串

每日一题系列(day 15) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

STM32_串口下载程序

目录标题 前言1、理论知识2、串口下载具体操作2.1、硬件准备2.2、软件准备2.3、设置单片机的启动模式为系统存储器启动2.4、软件配置2.5、下载程序 附:生成hex文件 前言 使用调试器下载程序又快有稳定还能使用调试功能,当然是下载调试的首选。但是拓展下串口下载程…

unittest自动化测试框架讲解以及实战

为什么要学习unittest 按照测试阶段来划分,可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,通常指函数或者类,一般是开发完成的。 单元…

【论文阅读笔记】Pre-trained Universal Medical Image Transformer

Luo L, Chen X, Tang B, et al. Pre-trained Universal Medical Image Transformer[J]. arXiv preprint arXiv:2312.07630, 2023.【代码开源】 【论文概述】 本文介绍了一种名为“预训练通用医学图像变换器(Pre-trained Universal Medical Image Transformer&…

浅谈深度学习中的不同归一化层

引言 目前,深度学习已经彻底改变了自然语言处理、计算机视觉、机器人等许多子领域。深度学习当然涉及训练精心设计的深度神经网络,并且各种设计决策会影响这些深度网络的训练机制。其中一些设计决策包括 网络中要使用的网络层类型,例如卷积…

AudioGPT 语音技术全覆盖:语音识别、增强、分离、风格迁移等 | 开源日报 No.114

stevearc/oil.nvim Stars: 1.7k License: MIT oil.nvim 是一个类似于 vim-vinegar 的文件浏览器,允许您像普通 Neovim 缓冲区一样编辑文件系统。其主要功能包括支持常见插件管理器、通过适配器抽象进行所有文件系统交互以及提供 API 来执行各种操作。该项目的关键…

LLM之RAG实战(五)| 高级RAG 01:使用小块检索,小块所属的大块喂给LLM,可以提高RAG性能

RAG(Retrieval Augmented Generation,检索增强生成)系统从给定的知识库中检索相关信息,从而使其能够生成事实信息、上下文相关信息和特定领域的信息。然而,在有效检索相关信息和生成高质量响应方面,RAG面临…

redis:六、数据过期删除策略(惰性删除、定期删除)和基于redisson实现的分布式锁(看门狗机制、主从一致性)和面试模板

数据过期删除策略 Redis的过期删除策略:惰性删除 定期删除两种策略进行配合使用 惰性删除 惰性删除:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就…

119. 杨辉三角 II

描述 : 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和 题目 : LeetCode 119. 杨辉三角 II : 119. 杨辉三角 II 分析 : 这道题用二维数组来做 . 解析 : class Solution {pub…

Jmeter接口测试断言

一、响应断言 对服务器的响应接口进行断言校验,来判断接口测试得到的接口返回值是否正确。 二、添加断言 1、apply to: 通常发出一个请求只触发一个请求,所以勾选“main sampie only”就可以;若发一个请求可以触发多个服务器请…

选择排序、快速排序和插入排序

1. 选择排序 xuanze_sort.c #include<stdio.h> #include<stdlib.h>//选择排序void xuanze_sort(int arr[],int sz){//正着for(int i0;i<sz;i){//外层循环从第一个数据开始依次作为基准数据for(int j i1;j<sz;j){//int j i1 因为第一个数据作为了基准数据&…

如何使用 C++ 开发 Redis 模块

在本文中&#xff0c;我将总结 Tair 在使用 C 开发 Redis 模块时遇到的一些问题&#xff0c;并将其提炼为最佳实践。目的是为 Redis 模块的用户和开发人员提供帮助。其中一些最佳实践也可以应用于 C 编程语言和其他编程语言。 介绍 从 Redis 5.0 开始&#xff0c;支持模块插件…

Unity中URP下的顶点偏移

文章目录 前言一、实现思路二、实现URP下的顶点偏移1、在顶点着色器中使用正弦函数&#xff0c;实现左右摇摆的效果2、在正弦函数的传入参数中&#xff0c;加入一个扰度值&#xff0c;实现不规则的顶点偏移3、修改正弦函数的振幅 A&#xff0c;让我们的偏移程度合适4、修改正弦…

【玩转 TableAgent 数据智能分析】股票交易数据分析+预测

文章目录 一、什么是TableAgent二、TableAgent 的特点三、实践前言四、实践准备4.1 打开官网4.2 注册账号4.3 界面介绍4.4 数据准备 五、确认分析需求六、TableAgent体验七、分析结果解读八、总结&展望 一、什么是TableAgent TableAgent是一款面向企业用户的智能数据分析工…

Redis——多级缓存

JVM进程缓存 为了演示多级缓存&#xff0c;这里先导入一个商品管理的案例&#xff0c;其中包含商品的CRUD功能。将来会给查询商品添加多级缓存。 导入Demo数据 1.安装mysql 后期做数据同步需要用到MySQL的主从功能&#xff0c;所以需要在虚拟机中&#xff0c;利用Docker来运…

C++ Qt 开发:ListWidget列表框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍ListWidget列表框组件的常用方法及灵活运用。…

【网络安全】-Linux操作系统基础

文章目录 Linux操作系统目录结构Linux命令格式Linux文件和目录操作命令Linux用户和用户组操作命令Linux查看和操作文件内容命令Linux文件压缩和解压缩命令Linux网络管理命令Linux磁盘管理和系统状态命令Linux安全加固总结 Linux是一个强大的操作系统&#xff0c;广泛用于服务器…

C# WPF上位机开发(进度条操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 软件上面如果一个操作比较缓慢&#xff0c;或者说需要很长的时间&#xff0c;那么这个时候最好添加一个进度条&#xff0c;提示一下当前任务的进展…