• Django内置模型查询讲解


    Django框架的核心特性之一是它的对象关系映射(ORM)系统,它允许开发者使用Python代码与数据库进行交互,而无需编写原始的SQL查询。Django的ORM提供了丰富的API来执行复杂的数据库查询。在这篇博客中,我们将详细讲解Django内置模型的查询方法。

    一、基础查询

    1. 获取所有对象

    使用all()方法可以获取模型中的所有对象。

    from myapp.models import MyModel
    
    objects = MyModel.objects.all()
    
    • 1
    • 2
    • 3
    1. 获取单个对象

    使用get()方法可以根据给定的条件获取单个对象。如果找到多个对象,它会抛出一个MultipleObjectsReturned异常;如果没有找到任何对象,它会抛出一个MyModel.DoesNotExist异常。

    obj = MyModel.objects.get(pk=1)
    
    • 1
    1. 过滤对象

    使用filter()方法可以根据给定的条件过滤对象。它返回的是一个QuerySet,包含所有符合条件的对象。

    objs = MyModel.objects.filter(name='John')
    
    • 1

    二、高级查询

    1. 链式查询

    你可以将多个查询方法链式调用,以构建更复杂的查询。

    objs = MyModel.objects.filter(name='John').exclude(age__lt=18)
    
    • 1
    1. 查询集(QuerySet)的切片

    你可以使用Python的切片语法来限制查询集返回的对象数量。

    objs = MyModel.objects.all()[:10]  # 返回前10个对象
    
    • 1
    1. 排序

    使用order_by()方法可以对查询结果进行排序。默认是升序排序,如果你想要降序排序,可以在字段名前加上-

    objs = MyModel.objects.all().order_by('name')  # 按name升序排序
    objs = MyModel.objects.all().order_by('-age')  # 按age降序排序
    
    • 1
    • 2
    1. 聚合和注解

    Django的ORM还提供了聚合和注解功能,允许你在查询集上执行复杂的数据库操作。例如,你可以计算某个字段的平均值、最大值、最小值等。

    from django.db.models import Avg
    
    avg_age = MyModel.objects.all().aggregate(Avg('age'))
    
    • 1
    • 2
    • 3

    三、性能优化

    1. 使用select_relatedprefetch_related

    当你执行跨多个模型的查询时,为了优化性能,可以使用select_relatedprefetch_relatedselect_related用于一对一和多对一关系,而prefetch_related用于多对多和反向多对一关系。

    # 使用select_related
    obj = MyModel.objects.select_related('related_model').get(pk=1)
    
    # 使用prefetch_related
    objs = MyModel.objects.prefetch_related('manytomany_field').filter(name='John')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 避免使用count(*)

    在可能的情况下,尽量避免在大量数据上使用count(*),因为它会计算所有匹配的行数,这在大数据集上可能会很慢。如果你只是想知道是否有匹配的行,可以使用exists()

    if MyModel.objects.filter(name='John').exists():
        # 执行某些操作
    
    • 1
    • 2

    Django的查询API非常强大和灵活,它允许开发者以声明式的方式编写复杂的数据库查询,而无需编写原始的SQL。然而,为了获得最佳性能,开发者需要了解查询是如何在数据库层面执行的,并合理地使用Django提供的优化工具。

  • 相关阅读:
    副业是刚需?分享几个程序员接外包私活的网站
    常用脚本学习手册——Bat脚本
    go语言|数据结构:二叉树(1)创建与遍历方法
    vue学习之列表渲染
    etcd实现大规模服务治理应用实战
    Docker实战-使用NGINX实现4层的负载均衡
    java计算机毕业设计中学生作文大赛管理平台源码+mysql数据库+系统+lw文档+部署
    【论文阅读】MONAI Label:人工智能辅助的 3D 医学图像交互式标注框架
    [MQ] SpringBoot使用扇型(广播)交换机/主题交换机
    restful请求风格的增删改查-----查询and添加
  • 原文地址:https://blog.csdn.net/Dxy1239310216/article/details/136272683