django的基本使用-ORM(二)

一、简介

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.mzph.cn/news/681242.shtml

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

相关文章

【Tauri】(3):使用Tauri1.5版本,进行桌面应用开发,在windows上搭建环境,安装node,rust环境,可以打包成功,使用vite创建应用

1,视频地址: https://www.bilibili.com/video/BV1Ny421a7nA/ 【Tauri】(3):使用Tauri1.5版本,进行桌面应用开发,在windows上搭建环境,安装node,rust环境,可以…

gstreamer 常用的图片格式转换命令

文章目录 前言一、怎样使用 gstreamer 生成 pattern 数据1. 将 videotestsrc 生成的 pattern 数据送显2. 将 videotestsrc 生成的 pattern 数据保存为图片(文件)二、gstreamer 如何对图片进行格式转换三、gstreamer 如何对图片进行缩放四、gstreamer 如何对图片进行裁剪总结前言…

安全SaaS服务转型的优与劣

文章目录 前言一、ToB的SaaS服务的神话(一)指数级的增长率(二)极低的销售成本二、SaaS 化的真实价值(一)云端数据驱动的AI安全能力建设(二)云端服务规模化带来的价格/效能优势(三)随时随地的统一安全接入与访问总结前言 SaaS化转型似乎是安全行业近十年来最重要的趋…

CorelDRAW2024国内专业个人免费版下载

CorelDRAW是一款屡获殊荣的图形和图像编辑软件,包含两个绘图应用程序:一个用于矢量图及页面设计,另一个用于图像编辑。自1989年进入中国市场以来,CorelDRAW不断推出新的版本和功能,以满足用户不断变化的需求。 CorelD…

【C++计算几何】点是否在线段上

题目描述 输入一个点Q和一条线段P1P2的坐标,判断这个点是否在该线段上。 输入 一行,共六个浮点数,依次表示Q,P1和P2的坐标。 输出 一行,一个字符数,“YES”或“NO”分别表示改点在或者不在线段上。 样…

python从入门到精通(十九):python的多线程详细使用

python的多线程详细使用 1.什么是线程2.线程的作用3.导入线程4.创建线程启动线程线程阻塞线程的方法 守护线程线程阻塞2个都是守护线程1个是守护线程 线程间通信 1.什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单…

数字图像处理实验记录十(图像分割实验)

一、基础知识 1、什么是图像分割 图像分割就是指把图像分成各具特性的区域并提取出感兴趣目标的技术和过程,特性可以是灰度、颜色、纹理等,目标可以对应单个区域,也可以对应多个区域。 2、图像分割是怎么实现的 图像分割算法基于像素值的不连…

「Java」static 关键字

介绍 概述:static 是一个静态关键字使用 修饰一个成员变量:static 数据类型 变量名 修饰一个方法 修饰符 static 返回值类型 方法名(形参){方法体 return 结果 }调用静态成员:类名直接调用(不用 new 对象) static…

ubuntu下如何查看显卡及显卡驱动

ubuntu下如何查看显卡及显卡驱动 使用nvidia-smi 工具查看 查看显卡型号nvida-smi -L $ nvidia-smi -L GPU 0: NVIDIA GeForce RTX 3050 4GB Laptop GPU (UUID: GPU-4cf7b7cb-f103-bf56-2d59-304f8996e28c)当然直接使用nvida-smi 命令可以查看更多信息 $ nvidia-smi Mon Fe…

C# CAD2016获取数据操作BlockTableRecord、Polyline、DBObject

一、数据操作说明 //DBObject 基础类 DBObject dbObj (DBObject)tr.GetObject(outerId, OpenMode.ForRead); //Polyline 线段类 Polyline outerPolyline (Polyline)tr.GetObject(outerId, OpenMode.ForRead); //BlockTableRecord 块表类 BlockTableRecord modelSpace (Bloc…

vue_dev_tools工具下载安装打包

vue_dev_tools工具下载安装打包 一、简介二、安装方式2.1.安装图文2.2.打包工具 endl 一、简介 使用 Vue 时,在浏览器上安装 Vue Devtools Vue Devtools 是 Vue 官方发布的调试浏览器插件,可以安装在 Chrome 和 Firefox 等浏览器上,直接内嵌…

LeetCode Python - 12. 整数转罗马数字

目录 题目答案运行结果 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。1…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去回车…

学习数据结构和算法的第8天

顺序表的实现 顺序表 ​ 本质就是数组 概念及结构 ​ 顺序表是用一段物理地址连续的储存单元依次储存数据元素的线性结构&#xff0c;一般情况下采用数组储存&#xff0c;在数组上完成数据的增删。 顺序表就是数组&#xff0c;但是在数组的基础上&#xff0c;它还要求数据…

网络安全的今年:量子、生成人工智能以及 LLM 和密码

尽管世界总是难以预测&#xff0c;但网络安全的几个强劲趋势表明未来几个月的发展充满希望和令人担忧。有一点是肯定的&#xff1a;2024 年将是非常重要且有趣的一年。 近年来&#xff0c;人工智能&#xff08;AI&#xff09;以令人难以置信的速度发展&#xff0c;其在网络安全…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中&#xff0c;安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时&#xff0c;保护用户信息的安全性是非常重要…

计算机硬件 7.1操作系统与驱动程序

第七章 软件系统 第一节 操作系统 驱动程序 一、操作系统 1.常见操作系统&#xff1a;Windows、mac os、Linux、Unix。 2.操作系统五大功能&#xff1a;处理器管理、存储器管理、设备管理、文件管理和作业管理。 3.安装过程&#xff1a; ①用存放操作系统的设备启动计算机&…

【算法题】102. 二叉树的层序遍历

题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a;…

中科大计网学习记录笔记(八):FTP | EMail

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

MySQL性能调优篇(3)-缓存的优化与清理

MySQL数据库缓存的优化与清理 数据库缓存在MySQL中扮演着非常重要的角色&#xff0c;它可以显著提高数据库的性能和响应速度。在本篇博客中&#xff0c;我们将介绍如何优化和清理MySQL数据库的缓存&#xff0c;以进一步提高数据库的效率。 优化缓存 1. 适当调整缓存大小 My…