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

相关推荐
GarfieldFine5 分钟前
MySQL索引使用一定有效吗?如何排查索引效果?
数据库·mysql
uhakadotcom24 分钟前
Lovable:用AI轻松打造完整应用,零基础也能快速开发
后端·面试·架构
小希爸爸25 分钟前
4、中医基础入门和养生
前端·后端
cypking30 分钟前
mysql 安装
数据库·mysql·adb
码起来呗31 分钟前
基于SpringBoot的高校学习讲座预约系统-项目分享
spring boot·后端·学习
坐吃山猪34 分钟前
Python-Agent调用多个Server-FastAPI版本
开发语言·python·fastapi
Asthenia041237 分钟前
Reactor 模型详解:从单线程到多线程及其在 Netty 和 Redis 中的应用
后端
一个数据大开发1 小时前
解读《数据资产质量评估实施规则》:企业数据资产认证落地的关键指南
大数据·数据库·人工智能
懵逼的小黑子1 小时前
django.db.utils.OperationalError: (1050, “Table ‘你的表名‘ already exists“)
django
Bruce-li__1 小时前
使用Django REST Framework快速开发API接口
python·django·sqlite