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

发布时间:2024年01月18日

Django ORM 中的单表查询 API(1)icon-default.png?t=N7T8https://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、代码演示

############### 单表查询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、小结

文章来源:https://blog.csdn.net/Python_1981/article/details/135674111
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。