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

使用 Django ORM 进行数据库操作

文章目录

    • 创建Django项目和应用
    • 定义模型
    • 查询数据
    • 更新和删除数据
    • 总结与进阶
      • 聚合和注解
      • 跨模型查询
      • 原始SQL查询

Django是一个流行的Web应用程序框架,它提供了一个强大且易于使用的对象关系映射(ORM)工具,用于与数据库进行交互。在本文中,我们将介绍如何使用Django ORM进行数据库操作,包括创建模型、查询数据、更新和删除等。
在这里插入图片描述

创建Django项目和应用

首先,确保你已经安装了Django。如果没有安装,可以使用以下命令进行安装:

pip install django

接下来,创建一个新的Django项目和一个应用:

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

定义模型

在Django中,模型是与数据库表对应的Python类。在myapp/models.py文件中定义模型:

from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)email = models.EmailField()def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.CASCADE)publish_date = models.DateField()def __str__(self):return self.title

然后,在myproject/settings.py文件中将myapp应用添加到INSTALLED_APPS列表中:

INSTALLED_APPS = [# ...'myapp',# ...
]

运行以下命令创建数据库表:

python manage.py makemigrations
python manage.py migrate

查询数据

使用Django ORM可以轻松地执行各种类型的数据库查询。例如,以下是一些常见的查询示例:

# 获取所有的作者
authors = Author.objects.all()# 根据条件过滤书籍
recent_books = Book.objects.filter(publish_date__gte='2022-01-01')# 获取单个对象
book = Book.objects.get(title='Python入门指南')

更新和删除数据

更新数据也很简单,只需使用save()方法保存修改后的对象:

book = Book.objects.get(title='Python入门指南')
book.title = 'Python进阶指南'
book.save()

要删除数据,可以使用delete()方法:

book = Book.objects.get(title='Python进阶指南')
book.delete()

总结与进阶

除了基本的数据库操作外,Django ORM还提供了许多其他高级功能,可以帮助开发人员更好地管理数据。一些拓展的内容包括:

聚合和注解

Django ORM允许使用聚合函数(如Sum、Count等)来执行复杂的数据分析操作,同时也支持使用注解(annotate)对查询结果进行标注,为结果集添加额外的信息。

from django.db.models import Count
# 计算每位作者出版的书籍数量
authors_with_book_count = Author.objects.annotate(book_count=Count('book'))

跨模型查询

通过Django ORM可以方便地进行跨模型的查询,利用ForeignKey、ManyToManyField等字段建立模型之间的关联,并且可以通过这些关联进行复杂的数据检索操作。

# 获取某个作者的所有书籍
author = Author.objects.get(name='张三')
books = author.book_set.all()

原始SQL查询

虽然Django ORM提供了强大的查询API,但有时候仍然需要执行原始的SQL查询。Django ORM允许开发人员执行原始的SQL查询,并将结果映射到模型中。

from django.db import connection
# 执行原始的SQL查询
with connection.cursor() as cursor:cursor.execute("SELECT * FROM myapp_author")row = cursor.fetchone()

通过深入学习和掌握这些进阶功能,开发人员可以更好地利用Django ORM来处理各种复杂的数据库操作,从而更高效地构建稳健的Web应用程序。

希望本文能够帮助你更全面地理解和应用Django ORM,进一步提升开发技能和应用水平!

相关文章:

  • 《逆水寒》手游周年庆,热度不减反增引发热议
  • Linux内核 -- 汇编 arm 处理器模式切换
  • spring中处理跨域的3种方案
  • 深入理解linux文件系统与日志分析
  • 智能化改造的关键点
  • 不是我愿意孤独,而是周围找不到同类
  • 大模型之路,从菜鸟到模型大师只需要一步
  • 初出茅庐的小李博客之使用立创开发板(ESP32)连接到EMQX Platform【MQTT TLS/SSL 端口连接】
  • 如何构建最小堆?
  • 爬虫学习--18.反爬斗争 selenium(3)
  • Inno Setup磁盘跨越必须启用,因为程序大于21000000000
  • 解析Java中1000个常用类:Error类,你学会了吗?
  • 考CCIE的难点在哪?英语不好?
  • 等保系列之——网络安全等级保护测评工作流程及工作内容
  • 解决 git 命令 Problem with the SSL CA cert (path? access rights?)
  • angular2 简述
  • Codepen 每日精选(2018-3-25)
  • ERLANG 网工修炼笔记 ---- UDP
  • spring security oauth2 password授权模式
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue的全局变量和全局拦截请求器
  • vue脚手架vue-cli
  • Windows Containers 大冒险: 容器网络
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 将回调地狱按在地上摩擦的Promise
  • 悄悄地说一个bug
  • 用Python写一份独特的元宵节祝福
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (汇总)os模块以及shutil模块对文件的操作
  • (理论篇)httpmoudle和httphandler一览
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET CORE Aws S3 使用
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 设计一套高性能的弱事件机制
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET企业级应用架构设计系列之结尾篇
  • @Data注解的作用
  • @Import注解详解
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [1127]图形打印 sdutOJ
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯