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、小结

相关推荐
2401_857610037 分钟前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
Leo.yuan36 分钟前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi
Runing_WoNiu44 分钟前
MySQL与Oracle对比及区别
数据库·mysql·oracle
秀儿还能再秀1 小时前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
天道有情战天下1 小时前
mysql锁机制详解
数据库·mysql
看山还是山,看水还是。1 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
谷新龙0011 小时前
Redis运行时的10大重要指标
数据库·redis·缓存
CodingBrother1 小时前
MySQL 中单列索引与联合索引分析
数据库·mysql
精进攻城狮@1 小时前
Redis缓存雪崩、缓存击穿、缓存穿透
数据库·redis·缓存
小酋仍在学习1 小时前
光驱验证 MD5 校验和
数据库·postgresql