django的基本使用-ORM(二)

news/发布时间2024/5/14 14:53:53

一、简介

ORM对象关系映射,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
模型层: 负责和数据库之间进行通信
模型是一个Python类,它是由django.db.models.Model派生出的子类
一个模型类代表数据库中的一张表
模型类中每一个类属性都代表数据库中的一个字段
模型是数据交互的接口,是表示和操作数据库的方法和方式

二、基本配置

1.配置settings.py

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'mydatabase','USER': 'admin','PASSWORD': 'abc123,','HOST': '192.168.1.23','PORT': '3306',}
}LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
常用配置
1.BASE_DIR:项目的绝对路径
2.DEBUG: 启动模式True: 调试模式检测代码改动后,立刻重启服务Fasle: 正式启动模式 / 上线模式3.ALLOWED_HOSTS: 允许访问本机的客户端主机,'*' 表示允许所有主机
4.DATABASES: 连接的数据库
5.LANGUAGE_CODE: 显示语言zh-Hans 表示用中文显示

2.安装mysqlclient

因为我们使用mysql作为后端,所以要安装mysqlclient库

pip install mysqlclient

3.创建应用

创建app1应用。发现在应用目录下多了app1目录

python manage.py startapp app1

4.注册应用

在setting.py中注册app1应用

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app1'  #在这里加入我们刚才创建的app1应用
]

5.创建对应的数据库表

create database mydatabase default character set utf8mb4;
grant all on mydatabase.* to 'admin'@'%' identified by 'abc123,';
grant all on mydatabase.* to 'admin'@'localhost' identified by 'abc123,';
grant all on mydatabase.* to 'admin'@'127.0.0.1' identified by 'abc123,'
flush privileges;修改该数据库字符集
alter database mydatabase character set utf8mb4 collate utf8mb4_unicode_ci;

迁移数据库,也就是使用python语法创建默认的库

python manage.py migrate

在库中查看,已经生成默认的数据库

mysql> use mydatabase
mysql> show tables;
+----------------------------+
| Tables_in_mydatabase       |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
10 rows in set (0.00 sec)

6.启动django测试

python manage.py runserver

三、ORM(模型)

1.创建模型类流程

在"应用(app1)"下的models.py中编写模型类

[root@node5 music]# vim models.py 
#文件中自动导入了models包,因为这是一个包,其实就是执行了__init__.py文件。在此文件中又导入了base.py中的Model类
from django.db import models

2.语法:

模型类名也就是表名

class 模型类名(models.Model):字段名1 = models.字段类型(字段选项)字段名2 = models.字段类型(字段选项)

3.实例

3.1 创建model类

编辑app1应用下的models.py文件

class student(models.Model):class Meta:db_table = 'my_table1'id = models.IntegerField(primary_key=True)name = models.CharField(max_length=20)age = models.IntegerField()
解释:
class student是模型类 继承models.Model类
Meta: 是自定义生成的表名,如果不定义,表名就是"应用名" + "模型类"组合而成的表名
id,name,age 分别是表中的字段
3.3 开始创建表

这个过程就是将类转换成sql的过程。django中这个过程叫做迁移

python manage.py makemigrations
python manage.py migrate

3.4 验证

mysql> use mydatabase
mysql> desc my_table1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
| age   | int(11)     | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

四、插入数据

1.方法1:

在app1应用的models.py文件中,直接写入以下语句进行插入数据

student.objects.create(id=1,name='zhangsan',age=20)然后命令行执行
python manage.py migrate

查看数据,已经插入成功

mysql> select * from my_table1;
+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  1 | zhangsan |  20 |
+----+----------+-----+

2.方法2

在视图函数中插入数据。

2.1 设置总路由

编辑项目目录下的urls.py文件

from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('app1/',include('app1.urls')),
]
2.2 设置分路由

在app1应用下新建urls.py文件。内容如下

from django.urls import path
from .views import *urlpatterns = [path('', fun_app1),
]
2.3 设置视图函数文件
# 导入model类中的student类
from .models import student
from django.http import  HttpResponsedef fun_app1(request):# 实例化student类s1 = student(id=3,name="lisi",age=22)# 写入数据,保存到数据库中s1.save()return  HttpResponse("写入数据库成功!")

五、单表查询数据

1.创建数据库表

我们在数据库中直接创建一个表,用于测试。这里不通过django自带迁移的功能的创建了。

mysql> use mydatabase
mysql> create table my_students1(id int primary key auto_increment,name char(32),age int);
mysql> insert into my_students1 (name,age) values('zhangsan',20),('lisi',20),('wangwu',21),('xiaohong',22),('xiaoming',23);
mysql> select * from my_students1;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   20 |
|  2 | lisi     |   20 |
|  3 | wangwu   |   21 |
|  4 | xiaohong |   22 |
|  5 | xiaoming |   23 |
+----+----------+------+
5 rows in set (0.00 sec)

2.创建模型类

在应用下(app1)的models.py中创建模型类,与刚才在数据库中创建的表建立对应关系.

class students1(models.Model):class Meta:db_table = 'my_students1' #这里的表名称一定要和数据库中表名保持一致id = models.AutoField(primary_key=True)name = models.CharField(max_length=32)age = models.IntegerField()

3.查询集合all()

编辑app1下的视图函数文件

from .models import *
from django.http import  HttpResponsedef fun_app1(request):# students1.objects.all返回的是一个django封装的queryset集合。简单理解为一个集合就可以了。# 集合中就是每行的记录,也是"模型类的实例对象"。这样遍历就是遍历每个实例对象。这样就可以打印每条数据了list = students1.objects.all()for i in list:print(i.id,i.name,i.age)return  HttpResponse("查询成功")

访问视图url路径,日志输出查询数据如下:

[11/Feb/2024 16:12:57] "GET /app1/ HTTP/1.1" 200 12
1 zhangsan 20 
2 lisi 20 
3 wangwu 21
4 xiaohong 22
5 xiaoming 23

4.集合过滤filter()

filter的返回结果也是一个queryset集合

from .models import *
from django.http import  HttpResponsedef fun_app1(request):list = students1.objects.filter(age=20)for i in list:print(i.id,i.name,i.age)return  HttpResponse("查询成功")

访问视图url路径,日志输出查询数据如下:

1 zhangsan 20 
2 lisi 20 
[11/Feb/2024 16:18:05] "GET /app1/ HTTP/1.1" 200 12
4.1 大于查询__gt
list = students1.objects.filter(age__gt=20)
for i in list:print(i.id,i.name,i.age)
4.2 小于查询__lt
list = students1.objects.filter(age__lt=23)
for i in list:print(i.id,i.name,i.age)
4.3 模糊查询__contains

查询语法:字段名__contains=“查询内容”

list = students1.objects.filter(name__contains="xiao")
for i in list:print(i.id,i.name,i.age)

5.get()

get函数的结果必须是一个结果,要是两个结果都不可以用这个。get的返回结果是一个模型类实例对象。不是queryset集合

list = students1.objects.get(id=1)
print(list.id,list.name,list.age)

6.取反exclude()

list = students1.objects.exclude(age=20)
for i in list:print(i.id,i.name,i.age)

结果如下:

3 wangwu 21
4 xiaohong 22
5 xiaoming 23

7.Q查询

q查询就是或关系查询

from .models import *
from django.db.models import Q
from django.http import  HttpResponsedef fun_app1(request):list = students1.objects.filter(Q(name="xiao") | Q(age=20))for i in list:print(i.id,i.name,i.age)return  HttpResponse("查询成功")

模型类函数有很多,具体可以参照官网

六、修改和删除

修改之前查看表内容

mysql> select * from my_students1;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   20 |
|  2 | lisi     |   20 |
|  3 | wangwu   |   21 |
|  4 | xiaohong |   22 |
|  5 | xiaoming |   23 |
+----+----------+------+
5 rows in set (0.01 sec)

1.修改update()

修改views.py视图函数内容

from .models import *
from django.db.models import Q
from django.http import  HttpResponsedef fun_app1(request):# 先查询年龄等于20的结果集list = students1.objects.filter(age=20)# 然后直接修改结果集list.update(age=30)#在查询修改后的结果list = students1.objects.filter(age=30)for i in list:print(i.id,i.name,i.age)return  HttpResponse("修改数据成功")

再次查看数据库内容,数据已经成功修改

 mysql> select * from my_students1;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   30 |
|  2 | lisi     |   30 |
|  3 | wangwu   |   21 |
|  4 | xiaohong |   22 |
|  5 | xiaoming |   23 |
+----+----------+------+
5 rows in set (0.00 sec)

2.删除delete()

例子1:
list = students1.objects.filter(age=30)
list.delete()例子2:
list = students1.objects.get(name='wangwu')
list.delete()

七、多表操作

1.一对多操作

1.1 创建my_publish表。

mysql> use mydatabase
mysql> create table my_publish(id int(10) primary key auto_increment,name varchar(20),addr varchar(50),email varchar(20));
mysql> desc my_publish;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(10)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| addr  | varchar(50) | YES  |     | NULL    |                |
| email | varchar(20) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

1.2.在my_publish表中插入数据

insert into my_publish values(0,'苹果出版社','北京',123),(0,'西瓜出版社','南京',456);
mysql> select * from my_publish;
+------+-----------------+--------+-------+
| id   | name            | addr   | email |
+------+-----------------+--------+-------+
|    1 | 苹果出版社        | 北京   | 123    |
|    2 | 西瓜出版社        | 南京   | 456    |
+------+-----------------+--------+-------+
2 rows in set (0.00 sec)

1.3.创建my_book表

create table my_book(id int(10) primary key auto_increment,title varchar(20),price double(5,2),publishDate datetime,publish_id int(10),foreign key(publish_id)
references my_publish(id));

查看创建的表结构

mysql> desc my_book;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(10)     | NO   | PRI | NULL    | auto_increment |
| title       | varchar(20) | YES  |     | NULL    |                |
| price       | double(5,2) | YES  |     | NULL    |                |
| publishDate | datetime    | YES  |     | NULL    |                |
| publish_id  | int(10)     | YES  | MUL | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

1.4 手动插入数据进行测试

mysql> insert into my_book values(0,"西游记",199.00,now(),1);
Query OK, 1 row affected (0.00 sec)# 查看数据是否插入成功
mysql> select * from my_book;
+------+-----------+--------+---------------------+------------+
| id   | title     | price  | publishDate         | publish_id |
+------+-----------+--------+---------------------+------------+
|    1 | 西游记    | 199.00 | 2024-02-11 21:08:50 |          1 |
+------+-----------+--------+---------------------+------------+
1 row in set (0.00 sec)

1.5 建立模型类

编辑app1应用下的models.py文件

from django.db import models# 创建my_publish表的模型类
class my_publish(models.Model):class Meta:db_table = 'my_publish' #这里的表名称一定要和数据库中表名保持一致id = models.AutoField(max_length=10,primary_key=True)name = models.CharField(max_length=20)addr = models.CharField(max_length=50)email = models.CharField(max_length=50)# 创建my_book表的模型类
class my_book(models.Model):class Meta:db_table = 'my_book'  # 这里的表名称一定要和数据库中表名保持一致id = models.AutoField(max_length=10,primary_key=True)title = models.CharField(max_length=20)price = models.FloatField()# auto_now_add 新增数据库数据库的时候才会触发这个时间,修改数据不会触发,修改要触发时间需要使用auto_now=TruepublishDate = models.DateTimeField(auto_now_add=True)#注意: publish 是外键,外键的名称django会自动补充上"_id".正好和数据库中的字段pubish_id字段对应上publish = models.ForeignKey(my_publish,null=True,on_delete=models.SET_NULL)

1.6 使用视图查询my_book数据

这里没有直接对my_book表直接进行插入数据操作而是先查询,原因是先看上边的的模型类定义的是否正确

from .models import *
from django.db.models import Q
from django.http import  HttpResponsedef fun_app1(request):list = my_book.objects.all()for i in  list:print(i.id,i.title,i.price,i.publishDate,i.publish_id)return  HttpResponse("查询数据成功")

1.7 使用视图插入数据

在app1应用下的视图函数

from .models import *
from django.http import  HttpResponsedef fun_app1(request):# 这里要注意,获取id时需要使用get,不能使用fiter,因为get返回的是结果,filter返回是查询对象集合# 这里pk是自动指向my_publish的主键。pk是primary key的简写。在django中pk是固定写法publish_id = my_publish.objects.get(pk=2)my_book.objects.create(title="水浒传",price="88.00",publish=publish_id)return  HttpResponse("插入数据成功")

查看数据库数据如下:

mysql> select * from my_book;
+----+-----------+--------+---------------------+------------+
| id | title     | price  | publishDate         | publish_id |
+----+-----------+--------+---------------------+------------+
|  1 | 西游记    | 199.00 | 2024-02-11 23:08:45 |          1  |
|  2 | 水浒传    |  88.00 | 2024-02-12 04:25:09 |          2  |
+----+-----------+--------+---------------------+------------+
2 rows in set (0.00 sec)-+

另外一种写法前边也介绍过了

from .models import *
from django.http import  HttpResponsedef fun_app1(request):publish_id = my_publish.objects.get(pk=2)book1 = my_book(title="三国演义",price="188.00",publish=publish_id)book1.save()return  HttpResponse("插入数据成功")

结果如下:

mysql> select * from my_book;
+----+--------------+--------+---------------------+------------+
| id | title        | price  | publishDate         | publish_id |
+----+--------------+--------+---------------------+------------+
|  1 | 西游记       | 199.00 | 2024-02-11 23:08:45 |          1  |
|  2 | 水浒传       |  88.00 | 2024-02-12 04:25:09 |          2  |
|  3 | 三国演义     | 188.00 | 2024-02-12 04:30:24 |          2  |
+----+--------------+--------+---------------------+------------+

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

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀

目录 引言 1. Python在股票市场分析中的应用 2. 投资组合优化 3. 风险管理与预测 时间序列分析 机器学习在风险预测中的应用 大数据分析与风险建模 总结 ⭐️ 好书推荐 【内容简介】 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默…

【嵌入式】CAN总线

1 简介 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。 CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线…

专业140+总分420+浙江大学842信号系统与数字电路考研经验电子信息与通信,真题,大纲,参考书。

今年考研已经结束,初试专业课842信号系统与数字电路140,总分420,很幸运实现了自己的目标,被浙大录取,这在高考是想都不敢想的学校,在考研时实现了,所以大家也要有信心,通过自己努力实…

LeetCode42.接雨水(单调栈)

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 : 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,…

解线性方程组(一)——克拉默法则求解(C++)

克拉默法则 解线性方程组最基础的方法就是使用克拉默法则,需要注意的是,该方程组必须是线性方程组。 假设有方程组如下: { a 11 x 1 a 12 x 2 ⋯ a 1 n x n b 1 a 21 x 1 a 22 x 2 ⋯ a 2 n x n b 2 ⋯ ⋯ ⋯ a n 1 x 1 a n 2 x 2…

阿赵UE学习笔记——15、灯光的移动性概念和构建光照信息

阿赵UE学习笔记目录   大家好,我是阿赵。   继续学习虚幻引擎,这次来学习一下UE里面灯光的移动性概念和构建光照信息。 1、灯光移动性 打开一个带有灯光的场景 在大纲面板里面找到其中一个灯光: 会发现灯光的细节面板里面,…

Java设计模式-结构型-适配器模式

Java设计模式-结构型-适配器模式 一、概述 ​ 与电源适配器相似,在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调…

《Solidity 简易速速上手小册》第2章:搭建 Solidity 开发环境(2024 最新版)

文章目录 2.1 安装和配置 Solidity2.1.1 基础知识解析安装 Solidity 编译器配置开发环境熟悉命令行工具 2.1.2 重点案例:配置本地开发环境案例 Demo:配置本地 Solidity 环境案例代码:HelloWorld.sol 2.1.3 拓展案例 1:设置 Remix …

OpenHarmony—UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,该UIAbility可以是应用内的其他UIAbility,也可以是其他应用的UIAbility(例如启动三方支付UIAbility)。 本章节将从如下场…

PDF合并工具

简单的PDF合并工具 简述 为了帮助同事做报销,就临时用 Python 使用 PDF 库打包了一个PDF文件合并工具,这个虽然对于很多程序员来说都是很简单的事情,但是对于一些不是很了解计算机技术的人确实是一个很尴尬的功能。 很多 PDF 编辑软件的这个…

《汇编语言》- 读书笔记 - 实验 10 编写子程序

《汇编语言》- 读书笔记 - 实验 10 编写子程序 1. 显示字符串问题子程序描述 show_str提示结果演示 2. 解决除法溢出的问题问题子程序描述 divdw提示结果演示 3. 数值显示问题子程序描述 dtoc提示结果演示 在这次实验中,我们将要编写3个子程序,通过它们来…

【MySQL】多表关系的基本学习

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-3oES1ZdkKIklfKzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【GO语言卵细胞级别教程】05.项目创建和函数讲解

感谢!点点赞和评论呀!我将继续更新 目录: 感谢!点点赞和评论呀!我将继续更新0.创建项目1.函数的引入2.注意事项3.详细介绍3.1 形参介绍 4.导入包4.1 基本知识4.2 注意事项 5.init函数6.匿名函数 0.创建项目 创建目录 …

以太坊 Dencun 升级与潜在机会

撰文:Biteye 核心贡献者 Fishery Isla 文章来源Techub News专栏作者,搜Tehub News下载查看更多Web3资讯。 以太坊网络升级 Dencun 测试网版本在 2024 年 1 月 17 日上线了 Goerli 测试网,1 月 30 日成功上线了 Sepolia 测试网,D…

拼夕夕 拼多多关键词恢复供应,欢迎骚扰

API接口(Application Programming Interface)是一种定义了软件组件之间交互的规范。它允许不同的软件系统之间进行通信和数据交换,使得开发者可以利用已有的功能和服务来构建自己的应用程序。 API接口可以分为不同的类型,包括Web…

[计算机网络]---UDP协议

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、端口号…

《剑指 Offer》专项突破版 - 面试题 47 : 二叉树剪枝(C++ 实现)

题目链接:LCR 047. 二叉树剪枝 - 力扣(LeetCode) 题目: 一棵二叉树的所有节点的值要么是 0 要么是 1,请剪除该二叉树中所有节点的值全都是 0 的子树。例如,在剪除下图 (a) 中二叉树中所有节点值都为 0 的…

多模态基础---BERT

1. BERT简介 BERT用于将一个输入的句子转换为word_embedding,本质上是多个Transformer的Encoder堆叠在一起。 其中单个Transformer Encoder结构如下: BERT-Base采用了12个Transformer Encoder。 BERT-large采用了24个Transformer Encoder。 2. BERT的…

集群聊天项目

不懂的一些东西 (const TcpConnectionPtr&)作为形参啥意思:接收一个常量引用,函数内部不允许修改该指针所指向的对象。 客户端与服务器如何联系? 优势 1.网络层与业务层分离:通过网络层传来的id,设计一个map存储id以及对印的业务处理器,处理器bind绑定处理函数,…

【PyQt】12-滑块、计数控件

文章目录 前言一、滑块控件 QSlider运行结果 二、计数器控件 QSpinBox运行结果 总结 前言 1、滑块控件 2、计数控件 一、滑块控件 QSlider #Author :susocool #Creattime:2024/2/15 #FileName:28-滑块控件 #Description: 通过滑块选择字体大小 import sys from PyQ…
推荐文章