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

django orm增删改查操作

1. 基本操作

1.1 创建对象

可以通过 Django ORM 来创建数据库中的记录。

示例:

# 方法1:先创建对象,再保存
person = Person(name='Alice', age=30, email='alice@example.com')
person.save()# 方法2:直接创建
person = Person.objects.create(name='Bob', age=25, email='bob@example.com')
1.2 查询数据

ORM 提供了丰富的查询接口,通过模型类的 objects 管理器进行查询。

查询所有记录:

people = Person.objects.all()  # 返回所有记录的 QuerySet

根据条件查询:

# 查找name为'Alice'的记录
person = Person.objects.get(name='Alice')# 过滤出age大于30的所有人
older_people = Person.objects.filter(age__gt=30)

查询结果排序:

# 按年龄升序排序
people = Person.objects.all().order_by('age')
1.3 更新数据

方式1:

person = Person.objects.get(name='Alice')
person.age = 31  # 修改属性
person.save()  # 保存修改

方式2(批量更新):

Person.objects.filter(name='Bob').update(age=26)
1.4 删除数据

单个删除:

person = Person.objects.get(name='Alice')
person.delete()

批量删除:

Person.objects.filter(age__lt=20).delete()  # 删除所有年龄小于20的人

2. 进阶操作

2.1 关联查询(外键、ManyToMany)

Django ORM 支持表与表之间的关联关系,如 ForeignKey(外键)和 ManyToManyField(多对多)。

示例:定义外键关联

class Group(models.Model):name = models.CharField(max_length=100)class Person(models.Model):name = models.CharField(max_length=100)group = models.ForeignKey(Group, on_delete=models.CASCADE)  # 外键关联

通过 ORM 可以轻松进行关联查询:

# 查找属于某个组的所有人
group = Group.objects.get(name='Developers')
people_in_group = group.person_set.all()  # 获取关联的所有 Person 对象
2.2 事务支持

Django ORM 支持事务管理,保证多个数据库操作的原子性。

示例:

from django.db import transactionwith transaction.atomic():person1 = Person.objects.create(name='Charlie', age=22)person2 = Person.objects.create(name='Dave', age=28)# 如果其中一个操作失败,另一个也会回滚
2.3 聚合查询

Django ORM 支持聚合查询,例如求和、平均值、最大值等。

示例:

from django.db.models import Avg, Max# 计算所有人的平均年龄
average_age = Person.objects.all().aggregate(Avg('age'))# 查找最大年龄
max_age = Person.objects.all().aggregate(Max('age'))

3. 查询优化(具体见“查询优化总结”)

Django ORM 提供了优化查询的方法,比如 select_relatedprefetch_related,用于减少多次数据库访问。

示例:

# 使用 select_related 进行外键优化查询
people = Person.objects.select_related('group').all()
http://www.lryc.cn/news/440133.html

相关文章:

  • 禁忌搜索算法(TS算法)求解实例---旅行商问题 (TSP)
  • Rust 所有权 简介
  • linux-网络管理-防火墙配置
  • 【springboot】实现文件上传和下载
  • 【RabbitMQ】RabbitMQ如何保证数据的可靠性,RabbitMQ如何保证数据不丢失,数据存储
  • Redis 篇-初步了解 Redis 持久化、Redis 主从集群、Redis 哨兵集群、Redis 分片集群
  • 算法基础-二分查找
  • LeetCode:1184. 公交站间的距离 一次遍历数组,复杂度O(n)
  • 牛客周赛 Round 60(A,B,C,D,E,F)
  • vueCropper裁剪图片(不模糊)以及记录使用方法
  • 【HTML】HTML页面和常见标签
  • 鸿蒙 ArkUI组件二
  • PHP 实现 redis 分布式锁
  • vue3 自定义el-tree树形结构样式
  • 【网络安全】分享4个高危业务逻辑漏洞
  • 【装机教程】Visual Studio Community 2019离线安装
  • NumPy 线性代数
  • 家装材料之水泥,最容易被忽视的基础材料!
  • openstack之keystone介绍
  • 【图像拼接】基于SIFT/SURF特征算法的图像拼接,matlab实现
  • 《微信小程序实战(2) · 组件封装》
  • LaTex2024 下载安装运行HelloWorld—全流程笔记
  • Golang | Leetcode Golang题解之第404题左叶子之和
  • 基于yolov8+lprnet的中文车牌识别系统python源码+pytorch模型+精美GUI界面
  • 电信创维光猫DT741超级密码
  • PostgreSQL的流复制断点续传
  • 【bug】通过lora方式微调sdxl inpainting踩坑
  • [Python可视化]数据可视化在医疗领域应用:提高诊断准确性和治疗效果
  • css <样式一>
  • Linux 文件 IO 管理(第一讲)