当前位置: 首页 > news >正文

Django ORM:数据库操作的Python化艺术

Django的对象关系映射器(ORM)是其核心功能之一,允许开发者使用Python代码来定义、操作和查询数据库。这篇文章将带你深入了解Django ORM的强大之处,从基本概念到高级查询技巧,提供丰富的示例帮助你掌握使用Django ORM进行有效和高效的数据库操作。

1. Django ORM基础

Django ORM的目的是提供一种简单的方法用来:

  • 将复杂的SQL查询转换为Python代码
  • 保护项目免受SQL注入攻击
  • 提供数据库后端的独立性

定义模型

在Django中,每个数据库表由一个Python类表示,这个类继承自django.db.models.Model

from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)age = models.IntegerField()def __str__(self):return self.name

进行数据库迁移

定义模型后,使用makemigrationsmigrate命令创建或更新数据库结构。

python manage.py makemigrations
python manage.py migrate

2. 创建记录

使用模型的构造函数创建新记录。

new_author = Author(name='J.K. Rowling', age=54)
new_author.save()

使用create方法

可以使用模型管理器的create方法更快捷地创建记录。

Author.objects.create(name='George R.R. Martin', age=71)

3. 读取记录

Django ORM提供了丰富的API来查询数据库。

获取所有记录

authors = Author.objects.all()

获取单个记录

author = Author.objects.get(name='J.K. Rowling')

过滤记录

young_authors = Author.objects.filter(age__lt=50)

排除特定记录

old_authors = Author.objects.exclude(age__lt=50)

4. 更新记录

更新记录就像修改任何其他Python对象。

author = Author.objects.get(name='J.K. Rowling')
author.age = 55
author.save()

批量更新

Author.objects.filter(age__lt=50).update(age=50)

5. 删除记录

删除记录也很直接。

author = Author.objects.get(name='J.K. Rowling')
author.delete()

批量删除

Author.objects.filter(age__gt=70).delete()

6. 高级查询操作

Django ORM的真正威力在于它的查询能力。

关联查询

class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE)books = Book.objects.filter(author__name='J.K. Rowling')

聚合查询

from django.db.models import Avg
average_age = Author.objects.all().aggregate(Avg('age'))

使用Q对象进行复杂查询

from django.db.models import Q
authors = Author.objects.filter(Q(age__gt=50) | Q(name__startswith='J'))

7. 数据库函数和表达式

Django ORM还允许开发者在查询中使用数据库函数。

使用F表达式比较字段值

from django.db.models import F
authors = Author.objects.filter(age__gt=F('age') - 10)

使用注解添加临时字段

from django.db.models import Count
books = Book.objects.annotate(num_authors=Count('author'))

8. ORM的优化

大型项目中,ORM的性能变得尤其重要。

使用select_relatedprefetch_related

减少数据库查询次数。

# select_related用于“一对一”和“多对一”关系
books = Book.objects.select_related('author')# prefetch_related用于“多对多”和“一对多”关系
authors = Author.objects.prefetch_related('book_set')

延迟字段加载

使用onlydefer来控制加载的字段。

Author.objects.defer('age')

结论

Django ORM提供了一个强大的抽象层来操作数据库,使得开发者可以避免写原生SQL并更专注于业务逻辑。通过这篇文章,你应该对如何高效地使用Django ORM有了清晰的理解。不过,值得注意的是,ORM的使用并非没有代价,有时它可能会隐藏性能问题,所以理解它的内部工作原理对于优化查询和提升性能是至关重要的。在深入使用之前,阅读官方文档并深入了解Django ORM的工作方式是一个不错的选择。

相关文章:

Django ORM:数据库操作的Python化艺术

Django的对象关系映射器(ORM)是其核心功能之一,允许开发者使用Python代码来定义、操作和查询数据库。这篇文章将带你深入了解Django ORM的强大之处,从基本概念到高级查询技巧,提供丰富的示例帮助你掌握使用Django ORM进…...

react受控组件与非受控组件

React中的组件可以分为受控组件和非受控组件: 受控组件:受控组件是指组件的值受到React组件状态的控制。通常在组件中,我们会通过state来存储组件的值,然后再将state的值传递给组件的props,从而实现组件的双向数据绑定…...

小米产品面试题:淘宝为何需要确认收货?京东为何不需要?

亲爱的小米粉丝们,大家好!我是小米,一个热爱技术、热衷于分享的小编。今天,我要和大家聊聊一个有趣的话题:为什么淘宝购物需要确认收货,而京东不需要?这可是一个让很多人纳闷的问题,…...

(1)上位机底部栏 UI如何设置

上位机如果像设置个多页面切换: 位置: 代码如下: "tabBar": {"color": "black","selectedColor": "#d43c33","borderStyle":"black","backgroundColor": …...

中国多主数据库:压强投入,期待破茧

拿破仑曾说:“战争的艺术就是在某一点上集中最大优势兵力”,强调了力量集中的重要性。 如今,国际形势风云变幻,西方世界对中国的围剿不再仅仅体现在军事和地缘政治上,而更多表现在经济与科技上。在科技领域&#xff0…...

JavaScript在ES6及后续新增的常用新特性

JavaScript经历了不同标本的迭代,在不断完善中会添加不同的新特性来解决前一个阶段的瑕疵,让我们开发更加便捷与写法更加简洁! 1、箭头函数: 箭头函数相比传统的函数语法,具有更简洁的语法、没有自己的this值、不会绑…...

试试流量回放,不用人工写自动化测试case了

大家好,我是洋子,接触过接口自动化测试的同学都知道,我们一般要基于某种自动化测试框架,编写自动化case,编写自动化case的依据来源于接口文档,对照接口文档里面的请求参数进行人工添加接口自动化case 其实…...

密钥管理系统功能及作用简介 安当加密

密钥管理系统的功能主要包括密钥生成、密钥注入、密钥备份、密钥恢复、密钥更新、密钥导出和服务,以及密钥的销毁等。 密钥生成:通过输入一到多组的密钥种子,按照可再现或不可再现的模式生成所需要的密钥。一般采用不可再现模式作为密钥生成…...

vue中watch属性的用法

在Vue中,watch属性用于监听一个数据的变化,并且在数据变化时执行一些操作。它可以观察一个具体的数据对象,从而在该数据对象发生变化时触发对应的回调函数。 使用watch属性的步骤如下: 在Vue实例中添加一个watch对象 new Vue({…...

Redis-使用java代码操作Redis

🏅我是默,一个在CSDN分享笔记的博主。📚📚 ​ 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这…...

0基础学习PyFlink——事件时间和运行时间的窗口

大纲 定制策略运行策略Reduce完整代码滑动窗口案例参考资料 在 《0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)》一文中,我们使用的是运行时间(Tumbling ProcessingTimeWindows)作为窗口的参考时间: reducedkeyed.window(TumblingProcess…...

Git Rebase 优化项目历史

在软件开发过程中,版本控制是必不可少的一环。Git作为当前最流行的版本控制系统,为开发者提供了强大的工具来管理和维护代码历史。git rebase是其中一个高级特性,它可以用来重新整理提交历史,使之更加清晰和线性。本文将详细介绍g…...

两种MySQL OCP认证应该如何选?

很多同学都找姚远老师说要参加MySQL OCP认证培训,但绝大部分同学并不知道MySQL OCP认证有两种,以MySQL 8.0为例。 一种是管理方向,叫:Oracle Certified Professional, MySQL 8.0 Database Administrator(我考试的比较…...

Java用log4j写日志

日志可以方便追踪和调试问题,以前用log4net写日志,换Java了改用log4j写日志,用法和log4net差不多。 到apache包下载下载log4j的包,解压后把下图两个jar包引入工程 先到网站根下加一个log4j2.xml的配置文件来配置日志的格式和参…...

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server,TiKV,TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP...

路由过滤路由引入

目录 一、实验拓扑 二、实验需求 三、实验步骤 1、配置IP地址 2、配置RIP和OSPF 3、配置路由引入 4、使用路由过滤,使 R4 无法学到 R1 的业务网段路由,要求使用 prefix-list 进行匹配 5、OSPF 区域中不能出现 RIP 协议报文 一、实验拓扑 二、实…...

视频剪辑技巧:批量合并视频,高效省时,添加背景音乐提升品质

随着社交媒体的兴起,视频制作越来越受到人们的关注。掌握一些视频剪辑技巧,可以让我们轻松地制作出令人惊艳的视频。本文将介绍一种高效、省时的视频剪辑技巧,帮助您批量合并视频、添加背景音乐,并提升视频品质。现在一起来看看云…...

数据可视化篇——pyecharts模块

在之前的文章中我们已经介绍过爬虫采集到的数据用途之一就是用作可视化报表,而pyecharts作为Python中可视化工具的一大神器必然就受到广大程序员的喜爱。 一、什么是Echarts? ECharts 官方网站 : https://echarts.apache.org/zh/index.html ECharts 是…...

Python--快速入门二

Python--快速入门二 1.Python数据类型 1.可以通过索引获取字符串中特定位置的字符: a "Hello" print(a[3]) 2.len函数获取字符串的长度: a "Hello" print(a) print(len(a)) 3.空值类型表示完全没有值: 若不确定当…...

【ArcGIS Pro二次开发】(74):Python、C#实现Excel截图导出图片

以村庄规划制图为例,通过对现状和规划用地的统计,生成Excel格式的【空间功能结构调整表】后,需要进一步将表格导出成图片,并嵌入到图集中,这样可以实现全流程不用手动参与,让制图的流程完全自动化。 关于E…...

前端骨架搭建

一、安装UI与功能库在终端运行以下命令npm install arco-design/web-vuenpm install lucide-vue-nextnpm install md-editor-v3npm install pinia axios分别安装预计项目所需的UI库、图标库、编辑器、状态管理功能。检查node版本,发现其为过时的v16版本,…...

WarcraftHelper:魔兽争霸III现代优化解决方案全玩家实战指南

WarcraftHelper:魔兽争霸III现代优化解决方案全玩家实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为魔兽…...

终极视频编码神器StaxRip:Windows平台最强大GUI工具完全指南

终极视频编码神器StaxRip:Windows平台最强大GUI工具完全指南 【免费下载链接】staxrip 🎞 Video encoding GUI for Windows. 项目地址: https://gitcode.com/gh_mirrors/st/staxrip 🎞️ 你是否正在寻找一款功能强大、灵活高效的视频编…...

基于 LangChain 1.0 的 LangGraph 高级应用

基于 LangChain 1.0 的 LangGraph 高级应用 文章目录基于 LangChain 1.0 的 LangGraph 高级应用1. 深度对比:Workflow vs Agent1.1 Workflow 实现示例(内容审核)1.2 Agent 实现示例(内容审核)2. 高级状态管理&#xff…...

2026行李箱推荐别乱买!唯尊、海澜之家、森马、外交官、珉璐保罗五款横评

对于技术从业者而言,行李箱不仅是装载衣物的容器,更是保护精密电子设备、应对高频差旅与跨城迁移的可靠装备。无论是前往异地调试系统、参加技术峰会,还是举家搬迁,一个设计合理、性能可靠的行李箱能显著提升出行效率与体验。本文…...

高效掌控Mem Reduct:智能多语言界面切换完全指南

高效掌控Mem Reduct:智能多语言界面切换完全指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你是否曾…...

openpilot终极指南:快速实现300+车型自动驾驶辅助的完整方案

openpilot终极指南:快速实现300车型自动驾驶辅助的完整方案 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Tr…...

解决OpenCore EFI配置难题:OpCore-Simplify如何实现零门槛系统搭建

解决OpenCore EFI配置难题:OpCore-Simplify如何实现零门槛系统搭建 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题剖析:为…...

小米笔记本Hackintosh无线网卡终极解决方案:Intel Wi-Fi驱动 vs 更换模块

小米笔记本Hackintosh无线网卡终极解决方案:Intel Wi-Fi驱动 vs 更换模块 【免费下载链接】XiaoMi-Pro-Hackintosh XiaoMi NoteBook Pro Hackintosh 项目地址: https://gitcode.com/gh_mirrors/xia/XiaoMi-Pro-Hackintosh 想要在小米笔记本上完美运行macOS系…...

稳定性与生态性的平衡:Windows 11 LTSC系统微软商店完整解决方案

稳定性与生态性的平衡:Windows 11 LTSC系统微软商店完整解决方案 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore Windows 11 LTSC&#xf…...