Django ORM 中的单表查询 API(1)https://blog.csdn.net/Python_1981/article/details/135653173 在上一篇博文中,我们探讨了 Django ORM 中单表查询 API 的基础知识,重点是 all()、filter()、get()、first() 和 last()。在本博文中,我们将深入探讨 Django ORM 中更高级的查询方法及其用法,包括 exclude()、order_by()、count()、reverse()、exists()、values()、values_list() 和 distinct()。
1、exclude() 方法
exclude() 方法用于根据特定条件从查询结果中排除对象。其工作原理与 filter() 方法类似,但会返回不符合指定条件的对象。例如
```
ret = Book.objects.exclude(price=88)
```
这将从 `Book` 表中检索价格不等于 88 的记录。
2、order_by() 方法
order_by() 方法用于根据一个或多个字段对查询结果进行排序。它允许开发人员指定字段的排序顺序(升序或降序)。例如
```
ret = Book.objects.all().order_by("price")
```
这将从 `Book` 表中检索所有记录,并按 `price` 字段升序排列。
3、count()方法
count() 方法返回符合查询条件的对象数量。这是一种方便的方法,可以在不获取所有对象的情况下检索表中记录的数量。例如
```
ret = Book.objects.all().count()
```
这将返回 `Book` 表中记录的总数。
4、reverse() 方法
reverse() 方法用于颠倒查询结果的顺序。该方法可在已使用 `order_by()` 方法排序的 QuerySet 上调用。例如
```
ret = Book.objects.all().order_by("price").reverse()
```
这将根据 `price` 字段反转查询结果的顺序。
5、exists() 方法
exists() 方法用于检查表中是否有符合查询条件的记录。它返回一个布尔值,表示表中是否有匹配记录。例如
```
is_exists = Book.objects.all().exists()
if is_exists:
print("Table has records")
```
6、values() 和 values_list() 方法
values() 和 values_list() 方法用于从查询结果中获取特定字段。它们允许开发人员只从数据库中获取所需的字段,并分别返回由字典或元组组成的 QuerySet。
7、distinct() 方法
distinct() 方法用于消除查询结果中的重复行。它会根据指定字段返回一个具有不同值的 QuerySet。
通过掌握 Django ORM 中这些先进的单表查询方法,开发人员可以高效地从数据库中检索、操作和分析数据,使他们的应用程序更加强大和灵活。
8、代码演示
python
############### 单表查询API ##################
def query(request):
# 5 exclude: 调用者 objects管理器 , 返回 QuerySet
# ret=Book.objects.exclude(price=88)
# SELECT `app01_book`.`id`, `app01_book`.`name`, `app01_book`.`price`, `app01_book`.`pub_date`,
# `app01_book`.`publish` FROM `app01_book` WHERE NOT(`app01_book`.`price` = 88) LIMIT 21
# print(ret)
# <QuerySet[ < Book: 111 >, < Book: java >, < Book: java999 >, < Book: 飘 >, < Book: 红楼梦 >, < Book: 西游记 >, < Book: 水浒传 >] >
# 6 order_by: 排序 ,由 QuerySet对象 调用,返回值是 QuerySet
# ret=Book.objects.all().order_by("price")
# SELECT `app01_book`.`id`, `app01_book`.`name`, `app01_book`.`price`, `app01_book`.`pub_date`,
# `app01_book`.`publish` FROM `app01_book` ORDER BY `app01_book`.`price` ASC LIMIT 21
# print(ret)
# ret=Book.objects.all().order_by("-price","-id")
# SELECT `app01_book`.`id`, `app01_book`.`name`, `app01_book`.`price`, `app01_book`.`pub_date`,
# `app01_book`.`publish` FROM `app01_book` ORDER BY `app01_book`.`price` DESC, `app01_book`.`id` DESC LIMIT 21
# print(ret)
# <QuerySet [<Book: 111>, <Book: java999>, <Book: linux>, <Book: 水浒传>, <Book: 西游记>, <Book: 飘>, <Book: java>, <Book: 红楼梦>]>
# 7 count: 数数 ,由 QuerySet对象 调用,返回值是 int
# ret=Book.objects.all().count()
# SELECT COUNT(*) AS `__count` FROM `app01_book`;
# print(ret) # 8
# 8 reverse: 翻转 ,由 QuerySet对象 调用,返回值是 QuerySet
# ret=Book.objects.all().order_by("price").reverse()
# print(ret)
# 9 exists: 判断表是否有记录 ,由 QuerySet对象 调用,返回值是 布尔值
# is_exists=Book.objects.all().exists()
# SELECT 1 AS `a` FROM `app01_book` LIMIT 1
# if is_exists:
# print("ok")
# 10 values:由 QuerySet对象 调用,返回值是 QuerySet
# ret = Book.objects.all().values("name", "price")
# SELECT `app01_book`.`name`, `app01_book`.`price` FROM `app01_book` LIMIT 21
# print(ret)
# < QuerySet[{'name': '111', 'price': Decimal('111.00')},
# {'name': 'linux', 'price': Decimal('88.00')},
# {'name': 'java', 'price': Decimal('22.00')},
# {'name': 'java999', 'price': Decimal('99.00')},
# {'name': '飘', 'price': Decimal('22.00')},
# {'name': '红楼梦', 'price': Decimal('11.00')},
# {'name': '西游记', 'price': Decimal('55.00')},
# {'name': '水浒传', 'price': Decimal('77.00')}] >
"""
ret=[]
for obj in Book.objects.all():
temp={"name":obj.name,"price":obj.price}
ret.append(temp)
"""
# 11 values_list:由 QuerySet对象 调用,返回值是 QuerySet
# ret = Book.objects.all().values_list("name", "price")
# SELECT `app01_book`.`name`, `app01_book`.`price` FROM `app01_book` LIMIT 21
# print(ret)
# < QuerySet[('111', Decimal('111.00')), ('linux', Decimal('88.00')), ('java', Decimal('22.00')),
# ('java999', Decimal('99.00')), ('飘', Decimal('22.00')), ('红楼梦', Decimal('11.00')),
# ('西游记', Decimal('55.00')), ('水浒传', Decimal('77.00'))] >
# 12 distinct:由 QuerySet对象 调用,返回值是 QuerySet
# ret = Book.objects.all().values("name").distinct()
# SELECT DISTINCT `app01_book`.`name` FROM `app01_book` LIMIT 21
# print(ret)
# < QuerySet[{'name': '111'}, {'name': 'linux'}, {'name': 'java'}, {'name': '飘'}, {'name': '红楼梦'},
# {'name': '西游记'}, {'name': '水浒传'}] >
return HttpResponse("query success")