Django ORM 中高级单表查询 API(2)

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")

9、小结

相关推荐
读心悦几秒前
修改 MySQL 数据库中的唯一键
数据库·mysql
SCBAiotAigc几秒前
VSCode debug模式无法跳转进入内置模块
人工智能·vscode·python
call_me_wangcheng13 分钟前
django创建项目
python·django
qq_2131578917 分钟前
(c#)unity中sqlite多线程同时开启事务会导致非常慢
数据库·sqlite·c#
北极无雪23 分钟前
Spring源码学习(拓展篇):SpringMVC中的异常处理
java·开发语言·数据库·学习·spring·servlet
VXbishe30 分钟前
(附源码)基于springboot的“我来找房”微信小程序的设计与实现-计算机毕设 23157
java·python·微信小程序·node.js·c#·php·课程设计
chusheng184032 分钟前
Python 如何使用 multiprocessing 模块创建进程池
python·信息可视化·matplotlib
猿小猴子35 分钟前
Python3 爬虫 中间人爬虫
开发语言·爬虫·python
666xiaoniuzi1 小时前
深入理解 C 语言中的内存操作函数:memcpy、memmove、memset 和 memcmp
android·c语言·数据库
正在走向自律1 小时前
3.使用条件语句编写存储过程(3/10)
数据库·存储过程·安全架构