IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Django9:ORM数据库操作及关系映射 -> 正文阅读

[大数据]Django9:ORM数据库操作及关系映射

0、管理器对象

?????? 每个继承自models.Model的模型类,都会有一个objects对象被同样继承下来。数据库的增删改查可通过模型的管理器实现。

calss MyModel(models.Model):
	MyModel.object.create()

1、创建数据

方法1:

MyModel.objects.create(属性1=值1,属性2=值2,…)
	成功:返回创建好的实体对象
	失败:抛出异常

方法2:

创建MyModel实例对象,并调用save()进行保存
obj = MyModel(属性=值,属性=值)
obj.属性=值
obj.save()

2、查询

? ? ? ?通过MyModel.objecs管理器掉员工查询方法

?(1)在模型类中定义__str__方法,自定义QuerySet中输出格式

例:在Book模型类中定义如下

def __str__(self):
?????? return ‘%s_%s_%s’(self.title, self.price, self.info)

(2)values(‘列1’, ‘列2’)

MyModel.objecs.values(…)

(3)values_list(‘列1’, ‘列2’)

MyModel.objecs.values_list(…)

(4)order_by()

MyModel.objecs.order_by(‘列1’, ‘列2’)

默认升序排序,降序在列前增加’-’

3、查询谓词

?????? 做更灵活的条件查询时需要使用查询谓词。每一个查询谓词时一个独立的查询功能。

(1)__exact:等值匹配

例:

Author.object.filter(id__exact)

(2)__contains:包含指定值

例:

# select * from author where name like ‘%w%’
Author.object.filter(name__contains=’w’)

另:

__startwith:以xx开始

__endwith:以xx结束

(3)__gt:大于

  • __gte:大于等于
  • __lt:小于
  • __lte:小于等于

(4)__in:查找数据是否在指定范围内

例:

# select * from author where contry in (‘中国’, ‘美国’)

__range:查找数据是否在指定区间范围内

4、更新数据

(1)单个实体更新

(a)查

? ? ? ?通过get()得到要修改的实体对象

(b)改

?????? 通过对象.属性的方式修改数据

(c)保存

通过对象.save()保存数据

(2)批量更新数据

? ? ? ?直接调用QuerySet的update(属性=值实现批量修改

例:

book = Book.object.all()
book.update(price=10)

5、删除数据

(1)单个数据删除

  • 查找查询结果对应的一个数据对象
  • 调用这个数据对象的delete()方法实现删除

(2)批量删除

  • 查找查询结果集中满足条件的全部QuerySet查询集合对象
  • 调用查询集合对象的delete()方法实现删除

(3)伪删除

? ? ? ?伪删除即在表中添加一个布尔型字段,默认是True,执行删除时,将欲删除数据的is_active字段设置为False。注意,伪删除时,确保显示数据的地方,均加了is_active=True的过滤查询。

6、F对象

? ? ? ?一个F对象代表数据库中某条记录的字段的信息。

(1)作用:

  • 通常是对数据库中的字段值在不获取的情况下进行操作。
  • 用于类属性(字段)之间的比较。

(2)语法

from django.db.models import F 

F(‘列名’)

7、Q对象

?????? 当在获取查询结果集使用复杂的逻辑或|、逻辑非~等操作时可借助于Q对象进行操作。

(1)作用

?????? 在条件中用来实现除and(&)以外的or(|)或not(~)操作。

运算符:

& 与、|或、~非

(2)语法

from django.db.models import Q

Q(条件1)|Q(条件2)	# 条件1成立或条件2成立
Q(条件1)&Q(条件2)	# 条件1成立且条件2成立
Q(条件1)|&~(条件2)	# 条件1成立且条件2不成立

例:

Book.objects.filter(Q(price__lt=20)|Q(pub=”清华大学出版社”))

8、聚合查询

?????? 聚合查询是指对数据表中的一个字段的数据进行部分或全部进行统计查询,主要分为整表聚合、分组聚合。

(1)整表聚合

?????? 不带分组的聚合查询是指导将全部数据进行统计查询。

(a)聚合函数导入

from django.db.models import *

Sun、Avg、Count、Max、Min

(b)语法

MyModel.object.aggregate(结果变量名=聚合函数(‘列’))

返回结果:结果变量名和值组成的字典

格式:{“结果变量名”:值}

(2)分组聚合

?????? 分组聚合是值通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可是平均值或综合),即为查询集的每一项生成聚合。

(a)语法

QuerySet.annotate(结果变量名=聚合函数(‘列’))

返回值:QuerySet

(b)步骤

  • 通过查询结果MyModel.object.values(‘列1’, ‘列2’)
  • 通过返回结果的QuerySet.annotate方法分组聚合得到分组结果

例:

b = Book.objects.values(‘pub’)
b.annotate(res=Count(‘id’))

9、原生数据库操作

?????? Django也可支持直接sql语句的方式通信数据库。不推荐,含sql注入。

(1)查询

使用MyModel.object.raw()进行数据库查询操作

语法:MyModel.object.raw(sql语句,拼接参数)

返回值:RawQuerySet集合对象(只支持基础操作,如循环)

例:

books = models.Book.objects.raw(‘select * from bookstore_book’)
for book in books:
	print(book)

例:防sql注入

b = models.Book.objects.raw(‘select * from bookstore_book where id=%s’,[‘1 or 1=1’])

(2)cursor

? ? ? ?完全跨过模型类操作数据库:查询、更新、删除

(a)导入cursor所在的包

from django.db import connection

(b)用创建cursor类的构造函数创建cursor对象,再使用cursor对象, 为保证在出现异常时能是否cursor资源,通常使用with语句进行创建操作:

from django.db import connnection
with connection.cursor() as cur:
	cur.execute(‘sql’语句, ’拼接参数 ’)

10、一对一映射

语法:

OneToOneField(类名,on_delete=xxx)

(1)on_delete:级联删除

????????models.CASCADE级联删除:Django模拟SQL约束ON DELETE CASCADE的行为,并删除包含ForeignKey的对象

????????models.PROTECT:抛出ProtectedError以阻止被引用对象的删除,等同于msyql默认的RESTRICT。

????????SET_NULL:设置ForeignKey null,需指定null=Ture

????????SET_DEFAUL:ForeignKey设置为默认值,必须ForeignKey的默认值

例:

class A(model.Model):
	…
class B(model.Model):
	属性 = models. OneToOneField(A, on_delete=xxx)

11、一对多映射

语法:

ForeignKey(“一”的模型类, on_delete=xxx)

例:

class A(model.Model):
	…
class B(model.Model):
	属性 = models. ForeignKey(“一”的模型类, on_delete=xxx)

12、多对多映射

? ? ? ?多对多在mysql中需要第三张表来实现,在Django中无需手动创建第三张表, Django自动完成。

语法:

?????? 在关联的两个类中的任意一个类中,增加

属性=models.ManyToManyField(MyModel)

例:

class A(model.Model):
	…
class B(model.Model):
	属性 = models. ManyToManyField(A)

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:58:25  更:2022-05-10 11:59:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:08:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码