前言
在Django的广阔世界里,ORM(对象关系映射)是连接数据库与Python代码的桥梁。而在这座桥梁上,QuerySet
无疑是最耀眼的明星。它不仅简化了复杂的数据库操作,还提供了丰富的查询和过滤功能,使得开发者能够轻松地在数据库与应用程序之间穿梭。本文将带你领略QuerySet的魅力,解析其概念、用途、原理,并附上实用的使用方法,让你在Django的开发之路上更加游刃有余。
一、什么是QuerySet?
QuerySet
是 Django 提供的一个高级接口,用于对数据库中的数据进行查询和操作。它是一个包含一系列数据库查询指令的集合,而不是实际的数据行。
QuerySet
对象是惰性的(lazy),这意味着它们不会立即执行查询,直到你真正需要结果时才会执行。
二、QuerySet 的用途
- 查询数据:可以对数据库中的记录进行筛选、排序、聚合等操作。
- 数据聚合:使用
aggregate
方法进行数据的统计和计算。 - 数据注释:使用
select_related
和prefetch_related
优化数据库查询,减少查询次数。 - 切片和迭代:可以对
QuerySet
进行切片,获取特定范围的结果,也可以迭代QuerySet
获取所有结果。 - 链式调用:
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 才会执行查询。这有几个关键点:
- 惰性执行:
QuerySet
直到真正需要数据时才执行查询,这可以避免不必要的数据库访问。- 查询优化:Django 会在内部优化查询,比如合并多个查询为一个,减少数据库的访问次数。
- 数据库抽象:
QuerySet
允许开发者以一种数据库无关的方式来编写数据库查询,Django 会将这些查询转换成适合底层数据库的 SQL。- 缓存: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()