【速存】深入理解Django ORM:编写高效的数据库查询

简介: 【速存】深入理解Django ORM:编写高效的数据库查询

Django作为一个高级Python Web框架,其自带的对象关系映射(ORM)是其最强大的特性之一。ORM允许开发者以编程语言原生的方式操作数据库,而无需编写原始的SQL查询。本文展示如何在Django项目中利用ORM执行各种数据库查询,并提供详细的代码示例及其解释。

基础查询操作

查询所有对象
from myapp.models import MyModel
# 获取MyModel表中的所有对象
all_entries = MyModel.objects.all()
for entry in all_entries:
    print(entry)
  • from myapp.models import MyModel: 导入应用中定义的模型。
  • MyModel.objects.all(): 获取MyModel表中的所有对象。
  • for entry in all_entries: 遍历查询到的所有对象,并打印。
过滤查询
# 获取所有is_active为True的对象
active_entries = MyModel.objects.filter(is_active=True)
for entry in active_entries:
    print(entry)
  • MyModel.objects.filter(is_active=True): 使用filter方法筛选出字段is_active值为True的对象。
排除查询
# 获取除了is_active为True之外的所有对象
inactive_entries = MyModel.objects.exclude(is_active=True)
for entry in inactive_entries:
    print(entry)
  • MyModel.objects.exclude(is_active=True): 使用exclude方法排除字段is_active值为True的对象。
获取单个对象
# 获取主键为1的单个对象
try:
    entry = MyModel.objects.get(pk=1)
    print(entry)
except MyModel.DoesNotExist:
    print("MyModel with pk=1 does not exist.")
  • MyModel.objects.get(pk=1): 获取主键(Primary Key)为1的对象。
  • try...except: 异常处理,防止查询不到对象时抛出DoesNotExist异常。

复杂查询操作

链式查询
# 获取is_active为True且name以'D'开头的所有对象
filtered_entries = MyModel.objects.filter(is_active=True).filter(name__startswith='D')
for entry in filtered_entries:
    print(entry)
  • filter(is_active=True).filter(name__startswith='D'): 链式调用filter方法来组合筛选条件。
Q对象复杂查询
from django.db.models import Q
# 获取is_active为True或者name以'D'开头的所有对象
complex_entries = MyModel.objects.filter(Q(is_active=True) | Q(name__startswith='D'))
for entry in complex_entries:
    print(entry)
  • from django.db.models import Q: 导入Q对象。
  • Q(is_active=True) | Q(name__startswith='D'): 使用Q对象结合逻辑运算符|(或)构建复杂查询。
跨关联关系查询

假设MyModel有一个外键ForeignKey指向另一个模型RelatedModel

# 获取MyModel的所有对象,其关联的RelatedModel对象的name为'Sample'
related_entries = MyModel.objects.filter(relatedmodel__name='Sample')
for entry in related_entries:
    print(entry)
  • relatedmodel__name='Sample': 使用双下划线__跨关联关系查询RelatedModelname字段。
聚合与分组查询
from django.db.models import Count
# 对MyModel对象按is_active字段进行分组,并计算每组的数量
grouped_entries = MyModel.objects.values('is_active').annotate(count=Count('id'))
for entry in grouped_entries:
    print(f"Active: {entry['is_active']}, Count: {entry['count']}")
  • from django.db.models import Count: 导入Count聚合函数。
  • values('is_active').annotate(count=Count('id')): 使用values方法分组并使用annotate进行聚合,计算每组的数量。

性能优化查询

选择性字段查询
# 仅获取MyModel对象的id和name字段
partial_entries = MyModel.objects.only('id', 'name')
for entry in partial_entries:
    print(entry.id, entry.name)
  • MyModel.objects.only('id', 'name'): 使用only方法来限制查询只返回特定字段。
延迟字段查询
# 在需要时才查询MyModel对象的description字段
deferred_entries = MyModel.objects.defer('description')
for entry in deferred_entries:
    print(entry.description)  # 这里才会实际查询description字段
  • MyModel.objects.defer('description'): 使用defer方法延迟加载指定字段,直到实际访问该字段时才会执行查询。
使用select_related优化关联对象查询

假设MyModel有一个外键ForeignKey指向另一个模型RelatedModel

# 通过select_related获取MyModel和其关联的RelatedModel对象
entries_with_related = MyModel.objects.select_related('relatedmodel')
for entry in entries_with_related:
    print(entry.relatedmodel)
  • MyModel.objects.select_related('relatedmodel'): 使用select_related方法来优化对关联对象的查询,减少数据库的查询次数。
使用prefetch_related优化多对多和反向关联查询

假设MyModelOtherModel有多对多关系。

# 通过prefetch_related获取MyModel及其多对多关联的OtherModel对象
entries_with_others = MyModel.objects.prefetch_related('othermodel_set')
for entry in entries_with_others:
    for other in entry.othermodel_set.all():
        print(other)
  • MyModel.objects.prefetch_related('othermodel_set'): 使用prefetch_related方法来优化多对多和反向关联查询。

赶紧存一下吧!


目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
Django入门到放弃之ORM单表操作
Django入门到放弃之ORM单表操作
|
2月前
|
SQL Go 数据库
Django入门到放弃之ORM多表操作
Django入门到放弃之ORM多表操作
|
4月前
|
SQL 缓存 数据库
Django中ORM性能调优
【6月更文挑战第19天】 1. **索引优化**:使用`db_index=True`为模型字段创建索引,提升查询速度。 2. **批量操作**:批量创建和更新,减少数据库交互。 3. **查询优化**:利用`select_related`和`prefetch_related`减少查询次数。 4. **缓存**:使用内置缓存或Redis减少数据库访问。 5. **异步任务**:用Celery处理耗时操作,提高响应速度。 6. **数据库连接池**:管理连接,减少创建和销毁开销。 7. **SQL直接操作**:在必要时用原生SQL,避免ORM性能瓶颈。 8. **分页查询**:减少数据传输,改善用
78 10
|
5月前
|
SQL 数据库 开发者
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
75 0
|
5月前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
279 1
|
5月前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
54 0
|
12月前
|
缓存 关系型数据库 MySQL
Django操作MySQL数据库的优化方法
Django操作MySQL数据库的优化方法
140 0
|
5月前
|
SQL 缓存 数据库
Django ORM的性能优化:高效处理大量数据
【4月更文挑战第15天】本文介绍了优化Django ORM性能的六大技巧:1) 使用批量操作如bulk_create和bulk_update;2) 利用prefetch_related和select_related减少查询次数;3) 为常用字段添加索引;4) 优化数据库查询,避免循环查询;5) 使用缓存提升频繁查询性能;6) 在必要时使用原生SQL。这些策略能帮助处理大量数据时提升Django ORM的效率。
|
5月前
|
SQL 自然语言处理 数据库连接
Django ORM的魔力:简化数据库操作与迁移
【4月更文挑战第15天】Django ORM是Django框架的关键部分,提供了一种高级的面向对象方式与数据库交互,简化了手动SQL操作。通过定义Python数据模型,开发者能轻松创建数据库表结构,使用ORM执行查询、添加、修改和删除数据。Django ORM还自动化处理数据库连接、事务和数据类型转换。当模型变化时,Django的迁移工具帮助管理数据库结构的更新。通过这种方式,Django ORM促进了高效、专注于业务逻辑的Web开发。
|
10月前
|
Python
django orm 批量更新不同内容
网上存在很多相似文章,都是使用drf-extension,但是这个包其实只是批量更新的一种方法,就是全部更新一个内容,这完全不符合自己的需求。
56 1