DjangoORM框架

article/2025/10/19 7:45:12

DjangoORM框架

文章目录

  • DjangoORM框架
    • 一、ORM框架
      • 1.ORM简介
      • 2.使用django进行数据库开发的步骤如下:
      • 3.定义模型类
      • 4.迁移
      • 5.数据操作
      • 5.对象的关联操作
      • 6.ORM框架的功能
    • 二、后台管理
      • 1.简介
      • 2.使用步骤
      • 3.管理界面本地化
      • 4.创建管理员
      • 5.注册模型类
      • 6.自定义管理页面

模型设计

我们之前操作数据库是通过写sql语句,那么能不能不写sql语句就可以操作数据库呢? 可以,就是通过接下来要给大家讲的ORM框架。

一、ORM框架

1.ORM简介

  • O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思。
  • 在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据
  • ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。
  • django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
    在这里插入图片描述
    在这里插入图片描述

2.使用django进行数据库开发的步骤如下:

  • 1.在models.py中定义模型类
  • 2.迁移
  • 3.通过类和对象完成数据增删改查操作

下面我们以保存图书信息为例来给大家介绍Django中进行数据库开发的整个流程。

3.定义模型类

模型类定义在models.py文件中,继承自models.Model类。

说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长。

  • 设计图书类

图书类:

类名:BookInfo
图书名称:btitle
图书发布日期:bpub_date

  • 模型类的设计

根据设计,在models.py中定义模型类如下:

from django.db import modelsclass BookInfo(models.Model):btitle = models.CharField(max_length=20)bpub_date = models.DateField()

4.迁移

迁移前目录结构如下图:
在这里插入图片描述

迁移由两步完成:

  • 1.生成迁移文件:根据模型类生成创建表的迁移文件。
  • 2.执行迁移:根据第一步生成的迁移文件在数据库中创建表。
生成迁移文件命令如下:python manage.py makemigrations

在这里插入图片描述
执行生成迁移文件命令后,会在应用booktest目录下的migrations目录中生成迁移文件

生成迁移文件后的目录结构:
在这里插入图片描述
打开上图中的迁移文件,内容如下:
在这里插入图片描述

  • Django框架根据我们设计的模型类生成了迁移文件,在迁移文件中我们可以看到fields列表中每一个元素跟BookInfo类属性名以及属性的类型是一致的。
  • 同时我们发现多了一个id项,这一项是Django框架帮我们自动生成的,在创建表的时候id就会作为对应表的主键列,并且主键列自动增长
执行迁移命令如下:python manage.py migrate

在这里插入图片描述
当执行迁移命令后,Django框架会读取迁移文件自动帮我们在数据库中生成对应的表格。

迁移后目录结构如下图:
在这里插入图片描述

  • Django默认采用sqlite3数据库,上图中的db.sqlite3就是Django框架帮我们自动生成的数据库文件。
  • sqlite3是一个很小的数据库,通常用在手机中,它跟mysql一样,我们也可以通过sql语句来操作它。
  • 下面使用sqliteman打开db.sqlite3文件进行查看。如果没有安装sqliteman,需要先使用如下命令进行安装。
sudo apt-get install sqliteman

安装成功之后,在终端输入sqliteman命令,敲击回车即可打开软件。

sqliteman界面如下:
在这里插入图片描述
按照下图的步骤找到要打开的数据库文件。
在这里插入图片描述
点击打开之后,点开Tables找到booktest_bookinfo,可以发现这个表中有三个列,列名跟BookInfo中类属性的名字是一样的。
在这里插入图片描述
双击上图中的booktest_bookinfo表,可以在右侧的Full View窗口中查看表格中的数据,这里表中还没有数据。
在这里插入图片描述

  • 默认生成的表名称

细心的同学会发现我们上面生成的表的名字叫做booktest_bookinfo,booktest是应用的名字,bookinfo是模型类的名字。

数据表的默认名称为:

<app_name>_<model_name>
例:
booktest_bookinfo
  • 设计英雄类

英雄类:

类名:HeroInfo
英雄姓名:hname
英雄性别:hgender
英雄简介:hcomment
英雄所属图书:hbook

图书-英雄的关系为一对多
打开booktest/models.py,定义英雄类代码如下:

class HeroInfo(models.Model):hname = models.CharField(max_length=20)hgender = models.BooleanField()hcomment = models.CharField(max_length=100)hbook = models.ForeignKey('BookInfo')
  • 这里要说明的是,BookInfo类和HeroInfo类之间具有一对多的关系,这个一对多的关系应该定义在多的那个类,也就是HeroInfo类中。
  • hbook =models.ForeignKey('BookInfo')这句代码就让BookInfo类和HeroInfo类之间建立了一对多的关系。
  • 在我们之后迁移生成表的时候,Django框架就会自动帮我们在图书表和英雄表之间建立一个外键关系。
生成迁移文件:python manage.py makemigrations

结果如下图:

在这里插入图片描述
项目目录结构:
在这里插入图片描述

执行迁移的命令:python manage.py migrate

在这里插入图片描述
最后我们可以看到数据库中生成的英雄表如下图:
在这里插入图片描述

注意上图中booktest_heroinfo表中有一列hbook_id,这一列名为什么不叫hbook? hbook_id是根据HeroInfo类的关系属性hbook生成的,对应着图书表中的主键id。

5.数据操作

完成数据表的迁移之后,下面就可以通过进入项目的shell,进行简单的API操作。如果需要退出项目,可以使用ctrl+d快捷键或输入quit()。

进入项目shell的命令:python manage.py shell

在这里插入图片描述

  • 首先引入booktest/models中的类:
from booktest.models import BookInfo,HeroInfo
  • 查询所有图书信息:
BookInfo.objects.all()

因为当前并没有数据,所以返回空列表
在这里插入图片描述

  • 新建图书对象:
b=BookInfo()
b.btitle="射雕英雄传"
from datetime import date
b.bpub_date=date(1991,1,31)
b.save()

在这里插入图片描述
再次查询所有图书信息:

BookInfo.objects.all()

在这里插入图片描述
查找图书信息并查看值:

b=BookInfo.objects.get(id=1)
b
b.id
b.btitle
b.bpub_date

在这里插入图片描述

  • 修改图书信息:

b.bpub_date=date(2017,1,1)
b.save()
b.bpub_date

在这里插入图片描述

  • 删除图书信息:
b.delete()

在这里插入图片描述

5.对象的关联操作

在这里插入图片描述
对于HeroInfo可以按照上面的方式进行增删改查操作。

  • 创建一个BookInfo对象
b=BookInfo()
b.btitle='abc'
b.bpub_date=date(2017,1,1)
b.save()

1)向booktest_bookinfo表中插入一条数据。
b = BookInfo() #定义一个BookInfo类的对象
b.btitle =‘天龙八部’ #定义b对象的属性并赋值
b.bpub_date = date(1990,10,11)
b.save() #才会将数据保存进数据库
2) 查询出booktest_bookinfo表中id为1的数据。
b = BookInfo.objects.get(id=1)
3) 在上一步的基础上改变b对应图书的出版日期。
b.bpub_date = date(1989,10,21)
b.save() #才会更新表格中的数据
4) 紧接上一步,删除b对应的图书的数据。
b.delete() #才会删除
5) 向booktest_heroInfo表中插入一条数据。
h = HeroInfo()
h.hname = ‘郭靖’
h.hgender = False
h.hcomment = ‘降龙十八掌’
b2 = BookInfo.objects.get(id=2)
h.hbook = b2 #给关系属性赋值,英雄对象所属的图书对象
h.save()
6) 查询图书表里面的所有内容。
BookInfo.objects.all()
HeroInfo.objects.all()

  • 创建一个HeroInfo对象
h=HeroInfo()
h.hname='a1'
h.hgender=False
h.hcomment='he is a boy'
h.hbook=b
h.save()

图书与英雄是一对多的关系,django中提供了关联的操作方式。

  • 获得关联集合:返回当前book对象的所有hero
b.heroinfo_set.all()

在这里插入图片描述

6.ORM框架的功能

  • a)建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。
  • b)根据设计的模型类生成数据库中的表格。
  • c)通过方便的配置就可以进行数据库的切换。

二、后台管理

1.简介

  • 假设我们要设计一个新闻网站,我们需要编写展示给用户的页面,网页上展示的新闻信息是从哪里来的呢?
  • 是从数据库中查找到新闻的信息,然后把它展示在页面上。
  • 但是我们的网站上的新闻每天都要更新,这就意味着对数据库的增、删、改、查操作,那么我们需要每天写sql语句操作数据库吗? 如果这样的话,是不是非常繁琐
  • 所以我们可以设计一个页面,通过对这个页面的操作来实现对新闻数据库的增删改查操作。
  • 那么问题来了,老板说我们需要在建立一个新网站,是不是还要设计一个页面来实现对新网站数据库的增删改查操作,但是这样的页面具有一个很大的重复性
  • 那有没有一种方法能够让我们很快的生成管理数据库表的页面呢?有,那就是我们接下来要给大家讲的Django的后台管理。
  • Django能够根据定义的模型类自动地生成管理页面。

2.使用步骤

使用Django的管理模块,需要按照如下步骤操作:

  • 1.管理界面本地化
  • 2.创建管理员
  • 3.注册模型类
  • 4.自定义管理页面

3.管理界面本地化

本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国化,中国大陆地区使用简体中文,时区使用亚洲/上海时区,注意这里不使用北京时区表示。

打开test1/settings.py文件,找到语言编码、时区的设置项,将内容改为如下:

LANGUAGE_CODE = 'zh-hans' #使用中国语言
TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间

4.创建管理员

创建管理员的命令如下,按提示输入用户名、邮箱、密码。

python manage.py createsuperuser

在这里插入图片描述
接下来启动服务器。

python manage.py runserver

在这里插入图片描述
打开浏览器,在地址栏中输入如下地址后回车。

http://127.0.0.1:8000/admin/

在这里插入图片描述
输入前面创建的用户名、密码完成登录。
在这里插入图片描述
登录成功后界面如下,但是并没有图书、英雄的管理入口,接下来进行第三步操作。
在这里插入图片描述

5.注册模型类

登录后台管理后,默认没有我们创建的应用中定义的模型类,需要在自己应用中的admin.py文件中注册,才可以在后台管理中看到,并进行增删改查操作。

打开booktest/admin.py文件,编写如下代码:

from django.contrib import admin
from booktest.models import BookInfo,HeroInfoadmin.site.register(BookInfo)
admin.site.register(HeroInfo)

到浏览器中刷新页面,可以看到模型类BookInfo和HeroInfo的管理了。

在这里插入图片描述
接下来就可以在该页面上进行增删查改操作了

6.自定义管理页面

在列表页只显示出了BookInfo object,对象的其它属性并没有列出来,查看非常不方便。 Django提供了自定义管理页面的功能,比如列表页要显示哪些值。

  • 打开booktest/admin.py文件,自定义类,继承自admin.ModelAdmin类
  • 属性list_display表示要显示哪些属性
class BookInfoAdmin(admin.ModelAdmin):list_display = ['id', 'btitle', 'bpub_date']
  • 修改模型类BookInfo的注册代码如下
admin.site.register(BookInfo, BookInfoAdmin)

刷新BookInfo的列表页,所有属性都显示出来了
在这里插入图片描述

  • 最终booktest/admin.py文件代码如下
from django.contrib import admin
from booktest.models import BookInfo,HeroInfoclass BookInfoAdmin(admin.ModelAdmin):list_display = ['id', 'btitle', 'bpub_date']
class HeroInfoAdmin(admin.ModelAdmin):list_display = ['id', 'hname','hgender','hcomment']admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)

http://chatgpt.dhexx.cn/article/y7dw8vgm.shtml

相关文章

mybatis —— ORM框架

一、什么是框架 框架是一种经过校验、具有一定功能的半成品软件品&#xff0c;已经对基础的代码进行了封装并提供相应的API&#xff0c;开发者在使用框架是直接调用封装好的api可以省去很多代码编写&#xff0c;从而提高工作效率和开发速度。 二、什么是ORM ORM&#…

ORM框架——SqlSugar

目录 一、ORM框架 二、SqlSugar现状 三、SqlSugar的优点 四、SqlSugar的使用 五、主要函数 六、传参 五、读写分离 一、ORM框架 常用的ORM框架有Dapper、EF/EF Core、FreeSql、Dos.ORM、SqlSugar等&#xff0c;SqlSugar是国产的 二、SqlSugar现状 SqlSugar ORM 5.X 官…

很多小伙伴不太了解ORM框架的底层原理,这不,冰河带你10分钟手撸一个极简版ORM框架(赶快收藏吧)

大家好&#xff0c;我是冰河~~ 最近很多小伙伴对ORM框架的实现很感兴趣&#xff0c;不少读者在冰河的微信上问&#xff1a;冰河&#xff0c;你知道ORM框架是如何实现的吗&#xff1f;比如像MyBatis和Hibernate这种ORM框架&#xff0c;它们是如何实现的呢&#xff1f; 为了能够…

.Net Core ORM 框架

我的.net core orm 框架 一个简单的orm框架支持的数据库版本新的版本项目地址使用方式实现方式高级特性扩展函数性能bug 一个简单的orm框架 作者在使用很多orm框架的时候觉得查询语句写法似乎不是很好用&#xff0c;例如sqlSugar,EF,sqlSugar呢链接的时候必须注意表的别称&…

SQLAlchemy ORM框架

ORM简介 ORM 全称 Object Relational Mapping, 叫对象关系映射。简单的说&#xff0c;ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样&#xff0c;我们要操作数据库&#xff0c;数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。 对于…

ORM框架

ORM框架 一、什么是ORM框架 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 ORM框架是连接数据库的桥梁&#xff0c;只要提供了持久化类与表的映射关系&#xff0c;OR…

ORM框架使用优缺点

1. 什么是ORM? 对象-关系映射&#xff08;Object-Relational Mapping&#xff0c;简称ORM&#xff09;&#xff0c;面向对象的开发方法是当今企业级应用开发环境中的主流开发方法&#xff0c;关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业…

Redis I/O 多路复用

引出IO多路复用 为什么 Redis 中要使用 I/O 多路复用这种技术呢&#xff1f; 首先&#xff0c;Redis 是跑在单线程中的&#xff0c;所有的操作都是按照顺序线性执行的&#xff0c;但是由于读写操作等待用户输入或输出都是阻塞的&#xff0c;所以 I/O 操作在一般情况下往往不能…

IO多路复用—由Redis的IO多路复用yinch

linux IO多路复用有epoll&#xff0c; poll, select&#xff0c;epoll性能比其他几者要好。 名词比较绕口&#xff0c;理解涵义就好。一个epoll场景&#xff1a;一个酒吧服务员&#xff08;一个线程&#xff09;&#xff0c;前面趴了一群醉汉&#xff0c;突然一个吼一声“倒酒”…

什么是IO多路复用?用来解决什么问题?如何实现?

白话IO多路复用 这里引述知乎大佬对于IO多路复用的机场空管的比喻和理解&#xff1a; 假设你是一个机场的空管&#xff0c; 你需要管理到你机场的所有的航线&#xff0c; 包括进港&#xff0c;出港&#xff0c; 有些航班需要放到停机坪等待&#xff0c;有些航班需要去登机口接…

I/O多路复用

https://blog.csdn.net/baixiaoshi/article/details/48708347 https://blog.csdn.net/z69183787/article/details/52943917 select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。所谓I/O多路复用机制&#xff0c;就是说通过一种机制&#xff0c;可以监视多个描述符…

概念 多路复用 到底是个啥?通俗易懂的理解

前言&#xff1a;教育的公平才是最大的公平&#xff0c;本科和专科还是有点差别的。时间长点学方面会充实些。 先给个结论&#xff1a;I/O多路复用技术&#xff08;就是大家经常说的事件循环&#xff09;实际上&#xff0c;事件驱动模型还有另外一个名字&#xff0c;而且更加出…

Redis的IO多路复用原理

什么是阻塞&#xff0c;非阻塞&#xff0c;异步同步&#xff0c;select&#xff0c;poll&#xff0c;epoll&#xff1f;今天我们用一遍文章解开这多年的迷惑。 首先我们想要通过网络接收消息&#xff0c;是这样的一个步骤。 用户空间向内核空间请求网络数据内核空间把网卡数据…

什么是IO多路复用,理解IO多路复用

什么是IO多路复用&#xff1f; IO 多路复用是一种同步IO模型&#xff0c;实现一个线程可以监视多个文件句柄&#xff1b;一旦某个文件句柄就绪&#xff0c;就能够通知应用程序进行相应的读写操作&#xff1b;没有文件句柄就绪就会阻塞应用程序&#xff0c;交出CPU。 多路是指网…

多路复用与多路分用

从现在开始&#xff0c;我们开始传输层的学习&#xff0c;自顶向下第六版中改成了运输层&#xff0c;感觉怪怪的 书中打了邮政服务和代收发信件的兄弟姐妹之间的比方&#xff0c;非常贴切&#xff0c;这是传输层和网络层的作用区别&#xff0c;也就是说&#xff0c;传输层管的是…

多路复用(

apue 多路复用 需求来自用户&#xff0c;用户的需求来自实际的使用场景。在实际运用中&#xff0c;一个系统或者程序需要处理的事件并不是只有一个或一类&#xff0c;而是存在各种各样的事件在一小段事件内一起发生&#xff0c;此时按照没学多线程的逻辑的处理方式就是这样&…

多路复用

讲多路复用先我觉得有必要讲一下什么是阻塞IO、非阻塞IO、同步IO、异步IO这几个东西&#xff1b;linux的五种IO模型&#xff1a; 1)阻塞I/O&#xff08;blocking I/O&#xff09; 2)非阻塞I/O&#xff08;nonblocking I/O&#xff09; 3) I/O复用(select和poll)&#xff08;…

io多路复用的原理和实现_IO多路复用机制详解

select&#xff0c;poll&#xff0c;epoll机制区别总结: 服务器端编程经常需要构造高性能的IO模型&#xff0c;常见的IO模型有四种&#xff1a; (1)同步阻塞IO(Blocking IO)&#xff1a;即传统的IO模型。 (2)同步非阻塞IO(Non-blocking IO)&#xff1a;默认创建的socket都是…

【多路复用器介绍】

【多路复用器介绍】意义 作用 实现 意义逻辑电路原理结构与真值表逻辑电路 实现代码参考资料 意义 多路复用器将接收的复合数据流&#xff0c;依照信道分离数据&#xff0c;并将它们送到对应的输出线上&#xff0c;故称为解多路复用器。 实际生活中&#xff0c;使用多路复用器…

多路复用技术(频分多路复用、时分多路复用和波分多路复用)

基带信号就是将数字信号1或0直接用两种不同的电压来表示&#xff0c;然后送到线路上去传输。 宽带信号则是将基带信号进行调制后形成的频分复用模拟信号。 多路复用技术的基本原理是&#xff1a;各路信号在进入同一个有线的或无线的传输媒质之前&#xff0c;先采用调制技术把…