Django ORM的QuerySet:解锁数据库交互的魔法钥匙

简介: Django ORM的QuerySet:解锁数据库交互的魔法钥匙

前言

    在Django的广阔世界里,ORM(对象关系映射)是连接数据库与Python代码的桥梁。而在这座桥梁上,QuerySet无疑是最耀眼的明星。它不仅简化了复杂的数据库操作,还提供了丰富的查询和过滤功能,使得开发者能够轻松地在数据库与应用程序之间穿梭。本文将带你领略QuerySet的魅力,解析其概念、用途、原理,并附上实用的使用方法,让你在Django的开发之路上更加游刃有余。


一、什么是QuerySet?

QuerySet 是 Django 提供的一个高级接口,用于对数据库中的数据进行查询和操作。它是一个包含一系列数据库查询指令的集合,而不是实际的数据行。

QuerySet 对象是惰性的(lazy),这意味着它们不会立即执行查询,直到你真正需要结果时才会执行。

二、QuerySet 的用途

  1. 查询数据:可以对数据库中的记录进行筛选、排序、聚合等操作。
  2. 数据聚合:使用 aggregate 方法进行数据的统计和计算。
  3. 数据注释:使用 select_relatedprefetch_related 优化数据库查询,减少查询次数。
  4. 切片和迭代:可以对 QuerySet 进行切片,获取特定范围的结果,也可以迭代 QuerySet 获取所有结果。
  5. 链式调用QuerySet 方法返回 QuerySet 对象,支持链式调用,使得查询构建清晰且易于阅读。

三、如何使用 QuerySet?

1. 基本查询

entries = Entry.objects.all()  # 获取所有记录

2. 筛选

entries = Entry.objects.filter(published_date__lte=timezone.now())

3. 排除

entries = Entry.objects.exclude(is_draft=True)

4. 排序

entries = Entry.objects.order_by('published_date')

5. 聚合

from django.db.models import Count
entries = Entry.objects.values('author').annotate(total=Count('id'))

6. 切片

first_five_entries = Entry.objects.all()[:5]  # 获取前五条记录

7. 迭代

for entry in Entry.objects.all():
    print(entry.title)

8. 链式调用

entries = Entry.objects.filter(is_published=True).order_by('-date_published')

四、QuerySet 的原理

QuerySet 的工作原理基于生成器模式当你创建一个 QuerySet 时,Django 会构建一个查询,但不会立即执行它只有当你需要 QuerySet 的数据时,Django 才会执行查询。这有几个关键点:

  1. 惰性执行QuerySet 直到真正需要数据时才执行查询,这可以避免不必要的数据库访问。
  2. 查询优化:Django 会在内部优化查询,比如合并多个查询为一个,减少数据库的访问次数。
  3. 数据库抽象QuerySet 允许开发者以一种数据库无关的方式来编写数据库查询,Django 会将这些查询转换成适合底层数据库的 SQL。
  4. 缓存:Django 可以对 QuerySet 结果进行缓存,以提高性能。

QuerySet 是 Django ORM 的强大工具,它使得数据库操作变得简单、直观且高效。通过 QuerySet,开发者可以轻松地构建复杂的数据库查询,同时保持代码的清晰和可维护性。


对QuerySet进行手动处理:

# 序列化
#query_set<[object, obj2]>
book_set = Book.objects.all()
books = []
#  遍历 每一个 模型对象
for book in book_set:
    books.append({
        'id': book.id,
        'btitle': book.btitle,
        'price': book.price,
        'bread': book.bread,
        'bcomment': book.bcomment
    })

反序列化:django将前端传递的json格式的字符串数据接收并转换为模型对象,这个过程称之为反序列化。

对获取的json数据,手动进行反序列化:

#获取前端传递数据
json_dict = request.data
json_dict = {
    "btitle":"光年",
    "price":18.8,
    "bread":20,
    "bcomment":200
}
# 模型对象,将获取的json格式数据插入
obj = Book()
obj.btitle = json_dict['btitle']
obj.price = json_dict['price']
obj.bread = json_dict['bread']
obj.bcomment = json_dict['bcomment']
ojb.save()
相关文章
|
29天前
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
23 4
|
1月前
|
SQL 安全 数据库连接
除了使用Django的ORM,还能通过什么方式在Django中避免SQL注入漏洞?
除了使用Django的ORM,还能通过什么方式在Django中避免SQL注入漏洞?
41 17
|
1月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
141 77
|
2月前
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
3月前
|
SQL 监控 数据库
深入探索Django ORM:高效数据操作的秘诀与实践####
在当今的Web开发领域,提升数据访问层的效率是优化应用性能的关键。本文旨在通过剖析Django框架中的ORM(对象关系映射)机制,揭示其如何简化数据库交互,并探讨一系列高级技巧与策略,帮助开发者构建更高效、可维护的数据访问代码。我们不涉及安装步骤或基础概念,而是聚焦于实战经验分享,旨在为中高级开发者提供深度洞见。 ####
|
3月前
|
存储 SQL API
探索后端开发:构建高效API与数据库交互
【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
|
4月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
156 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
4月前
|
存储 SQL 关系型数据库
PHP与数据库交互:从基础到进阶
【10月更文挑战第9天】在编程的世界里,数据是流动的血液,而数据库则是存储这些珍贵资源的心脏。PHP作为一门流行的服务器端脚本语言,其与数据库的交互能力至关重要。本文将带你从PHP与数据库的基本连接开始,逐步深入到复杂查询的编写和优化,以及如何使用PHP处理数据库结果。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技巧,让你在PHP和数据库交互的道路上更加从容不迫。
|
4月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
130 0
|
5月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗

热门文章

最新文章