首页 > 其他分享 >Django框架--ORM操作

Django框架--ORM操作

时间:2024-11-26 16:48:37浏览次数:4  
标签:示例 -- MyModel related 查询 field ORM SQL Django

1. 查询操作

1.1 filter()

用法

  • 用于过滤查询结果,返回符合条件的记录。
  • 支持链式调用。

示例

queryset = MyModel.objects.filter(field=value)

SQL 查询示例

SELECT * FROM MyModel WHERE field = value;

性能特点

  • 根据过滤条件生成 SQL 查询。
  • 支持复杂查询条件,性能取决于查询条件和索引。
1.2 exclude()

用法

  • 用于排除符合条件的记录。
  • 结果集为所有不符合条件的记录。

示例

queryset = MyModel.objects.exclude(field=value)

SQL 查询示例

SELECT * FROM MyModel WHERE field != value;

性能特点

  • 类似于 filter(),但条件是排除的。
  • 适用于排除某些不需要的记录。
1.3 get()

用法

  • 用于获取唯一的记录。如果查询条件匹配到多个记录,会引发 MultipleObjectsReturned 异常。

示例

obj = MyModel.objects.get(id=1)

SQL 查询示例

SELECT * FROM MyModel WHERE id = 1 LIMIT 1;

性能特点

  • 执行带有 LIMIT 1 的查询。
  • 适用于查找唯一记录。
1.4 aggregate()

用法

  • 用于对查询结果进行聚合操作,如计数、求和、平均值等。

示例

from django.db.models import Count, Sum

result = MyModel.objects.aggregate(total=Count('field'))

SQL 查询示例

SELECT COUNT(field) AS total FROM MyModel;

性能特点

  • 使用聚合函数进行计算,性能依赖于数据量和聚合函数。 只返回聚合结果,不包括具体的记录数据。
1.5 annotate()

用法

  • 用于给每个记录添加计算字段或聚合结果。

示例

from django.db.models import Count

queryset = MyModel.objects.annotate(num_related=Count('related_model'))

SQL 查询示例

SELECT MyModel.*, COUNT(RelatedModel.id) AS num_related
FROM MyModel
LEFT JOIN RelatedModel ON MyModel.id = RelatedModel.parent_model_id
GROUP BY MyModel.id;

性能特点

  • 添加计算字段,使用 LEFT JOIN 和聚合操作。 执行带有 GROUP BY 的查询,计算每个记录的聚合数据。
1.6 values()

用法

  • 返回一个包含字典的 QuerySet,每个字典代表一行数据。

示例

queryset = MyModel.objects.values('field1', 'field2')

SQL 查询示例

SELECT field1, field2 FROM MyModel;

性能特点

  • 只返回指定字段,减少数据传输量。
1.7 values_list()

用法

  • 返回一个包含元组的 QuerySet,每个元组代表一行数据。

示例

queryset = MyModel.objects.values_list('field1', 'field2')

SQL 查询示例

SELECT field1, field2 FROM MyModel;

性能特点

  • 返回元组数据,适合处理不需要字段名称的结果。

2. 更新操作

2.1 update()

用法

  • 用于批量更新符合条件的记录。

示例

MyModel.objects.filter(condition).update(field=value)

SQL 查询示例

UPDATE MyModel SET field = value WHERE condition;

性能特点

  • 高效的批量更新操作,不会触发 save() 方法。

3. 删除操作

3.1 delete()

用法

  • 用于删除符合条件的记录。删除操作会触发模型的 delete() 方法。

示例

MyModel.objects.filter(condition).delete()

SQL 查询示例

DELETE FROM MyModel WHERE condition;

性能特点

  • 删除操作会在数据库中实际删除记录,可能触发级联删除和信号处理。

4. 关联查询

4.1 select_related()

用法

  • 用于一对一和外键关系的优化查询,通过 INNER JOIN 一次性加载所有关联数据。

示例

queryset = MyModel.objects.select_related('related_model')

SQL 查询示例

SELECT MyModel.*, RelatedModel.*
FROM MyModel
INNER JOIN RelatedModel ON MyModel.related_model_id = RelatedModel.id;

性能特点

  • 高效减少数据库查询次数,但可能丢失主表记录(因 INNER JOIN)。
4.2 prefetch_related()

用法

  • 用于一对多和多对多关系的优化查询,通过多个查询在 Python 层面合并结果。

示例

queryset = MyModel.objects.prefetch_related('related_model')

SQL 查询示例

-- 第一个查询
SELECT * FROM MyModel;

-- 第二个查询
SELECT * FROM RelatedModel WHERE related_model_id IN (1, 2, 3, ...);

性能特点

  • 不丢失主表记录,适用于复杂关系,但可能增加查询时间和内存使用。
4.3 . 查询(点操作符)

用法

  • 用于通过点操作符访问外键字段。

示例

queryset = MyModel.objects.filter(related_model__field=value)

SQL 查询示例

SELECT * FROM MyModel
INNER JOIN RelatedModel ON MyModel.related_model_id = RelatedModel.id
WHERE RelatedModel.field = value;

性能特点

  • 主表记录仅在关联表中有匹配记录时才会返回,可能导致额外查询(N+1 问题)。

1:首先执行一个查询,从主表中获取数据(比如,获取 N 个对象)。

N:对于每个从主表返回的记录,再执行额外的查询去获取关联数据(比如,获取每个对象的外键关系的详细信息)。

books = Book.objects.all()

for book in books:

print(book.author.name)

解决 N+1 问题的常见方法是使用 select_related()(一对一或外键关系)和 prefetch_related()(多对多或反向外键关系)来减少数据库查询次数。

4.4 __ 查询(双下划线语法)

用法

  • 用于跨表字段查询,支持条件过滤和字段选择。

示例

queryset = MyModel.objects.filter(related_model__field=value).values('field')

SQL 查询示例

SELECT MyModel.field, RelatedModel.field
FROM MyModel
INNER JOIN RelatedModel ON MyModel.related_model_id = RelatedModel.id
WHERE RelatedModel.field = value;

性能特点

  • 支持复杂查询,但可能丢失主表记录(因 INNER JOIN),查询复杂性高。

总结与比较

  • 查询操作filter()exclude() 支持灵活的条件查询,get() 用于获取唯一记录,aggregate()annotate() 用于聚合和计算,values()values_list() 用于简化数据获取。
  • 更新操作update() 高效批量更新记录。
  • 删除操作delete() 删除记录并触发相关信号和级联删除。
  • 关联查询
    • select_related: 适用于一对一和外键关系,通过 INNER JOIN 加载数据,丢失主表记录的风险。
    • prefetch_related: 适用于一对多和多对多关系,通过多个查询加载数据,确保主表记录。
    • . 查询: 通过点操作符访问外键字段,可能导致额外查询(N+1 问题)。
    • __ 查询: 支持复杂的跨表查询,使用 INNER JOIN,主表记录可能丢失。

标签:示例,--,MyModel,related,查询,field,ORM,SQL,Django
From: https://www.cnblogs.com/Studywith/p/18570466

相关文章

  • 前端技术学习路线图
    以下Web开发人员学习路线图是来自Githubdeveloper-roadmap项目,目前已经有繁体版翻译developer-roadmap-chinese。主要有三个方向,分别为前端开发、后端开发和运维。图片中不同颜色的意义:黄色:推荐;灰色:尽可能学习;橙色:任选其一。可以看到,作为Web开发者,不管从事什么职位,下......
  • 10 EXcel表格数据透视表介绍
     1.数据透视表的基本概念1.1什么是数据透视表数据透视表是Excel中用于快速汇总、分析和呈现数据的强大工具。通过简单的拖拽操作,可以轻松对数据进行分类汇总、筛选、分组等操作,适用于大数据量的分析。核心特点:数据动态汇总:可以自动更新结果。强大的数据可视化:支持生成......
  • Vite项目怎么进行屏幕适配?
    基于rem的适配方案1、安装依赖npmipostcss-pxtoremautoprefixeramfe-flexible--save-devpostcss-pxtorem是PostCSS的插件,用于将像素单元生成rem单位autoprefixer浏览器前缀处理插件amfe-flexible可伸缩布局方案替代了原先的lib-flexible 选用了当前众多浏览器兼容的......
  • 使用Perl实现基本图像识别
    Perl是一种强大的编程语言,广泛用于文本处理和系统管理。虽然Perl本身并不专注于图像处理,但通过外部库(如Image::Magick),我们可以非常方便地进行图像识别和处理。以下示例展示如何使用Perl和Image::Magick库实现图像的边缘检测。环境准备安装Perl和Image::Magick:在大多......
  • 性能指标详解
    一、监听器中的插件@gc-ActiveThreadsOverTimeip活动线程时间@gc-AutoStopListener自动停止侦听器@gc-BytesThroughputOverTimejp字节吞吐量随时间变化@gc-CompositeGraph综合图@gc-ConnectTimesOverTimejp连接时间@gc-ConsoleStatusLoggerjp......
  • DJANGO进阶:信号机制
    django信号是一种机制,允许你在特定事件发生时(不需要再次修改"特定事件"的代码),执行另一部分的代码逻辑意义:类似于装饰器的作用,可以在不修改现有代码的逻辑下,触发自定义逻辑常见用途数据变更通知:当模型实例被创建、更新或删除时发送信号用户注册/登录:在用户注册或登录......
  • 使用Perl实现图像识别
    Perl是一种强大的编程语言,广泛用于文本处理和系统管理。虽然Perl本身并不专注于图像处理,但通过外部库(如Image::Magick),我们可以非常方便地进行图像识别和处理。以下示例展示如何使用Perl和Image::Magick库实现图像的边缘检测。环境准备安装Perl和Image::Magick:在大多......
  • 工业产线机械臂数字孪生 | 图扑流程工业应用
    图扑软件根据实验室构建的工业产线机械臂数字孪生环境,对数字孪生关键构件、工作过程进行验证,形成此文,与大家共同探讨数字孪生系统构建的关键技术。场景概览工业产线机械臂通过精确的重复动作执行复杂的任务。图扑软件自主研发的HTforWeb产品数字孪生搭建应用,使机械臂的每个......
  • IT审计
    系统安全(一)系统的测试《证券基金经营机构信息技术管理办法》(以下简称《IT管理办法》)规定证券基金经营机构应当建立独立于生产环境的专用开发测试环境,避免风险传导;在生产环境开展重要信息系统技术或业务测试的,应对测试流程及结果进行审查。(二)安全监测《IT管理办法》规定证券基......
  • AI智能分析视频分析网关摄像机实时接入分析平台人脸识别有哪些技术要求?
    在现代社会,随着安全意识的提高和技术的发展,人脸识别技术已成为安防领域的关键技术之一。它不仅在提高安全性、优化管理流程方面发挥着重要作用,还在确保公共安全、加强个人隐私保护等方面扮演着越来越重要的角色。本文将详细介绍人脸识别技术在安防领域的技术要求、应用系统的标准......