热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Django中的全部ORM操作

执行原生SQL,场景:复杂SQL语句1fromdjango.dbimportconnection,connections23#配置选择哪个数据库cursorconn

执行原生SQL,场景:复杂SQL语句

1 from django.db import connection, connections
2 
3 #配置选择哪个数据库 cursor = connections['db1'].cursor() 
4 cursor = connection.cursor() 
5 cursor.execute("""SELECT * from auth_user where id = %s""", [1,])
6 
7 # row = cursor.fetchall() # 获取符合条件的所有数据,models.User.objects.all()
8 row = cursor.fetchone() # 获取符合条件的第一条数据,models.User.objects.all().first()

ORM自带的操作

  1              def all(self)
  2                         # 获取所有的数据对象
  3 
  4                     def filter(self, *args, **kwargs)
  5                         # 条件查询
  6                         # 条件可以是:参数,字典,Q
  7 
  8                     def exclude(self, *args, **kwargs)
  9                         # 条件查询
 10                         # 条件可以是:参数,字典,Q
 11 
 12                     def select_related(self, *fields)
 13                          性能相关:表之间进行join连表操作,一次性获取关联的数据。
 14                          model.tb.objects.all().select_related()
 15                          model.tb.objects.all().select_related('外键字段')
 16                          model.tb.objects.all().select_related('外键字段__外键字段')
 17 
 18                     def prefetch_related(self, *lookups)
 19                         性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。
 20                                 # 获取所有用户表
 21                                 # 获取用户类型表where id in (用户表中的查到的所有用户ID)
 22                                 models.UserInfo.objects.prefetch_related('外键字段')
 23 
 24 
 25 
 26                                 from django.db.models import Count, Case, When, IntegerField
 27                                 Article.objects.annotate(
 28                                     numviews=Count(Case(
 29                                         When(readership__what_time__lt=treshold, then=1),
 30                                         output_field=CharField(),
 31                                     ))
 32                                 )
 33 
 34                                 students = Student.objects.all().annotate(num_excused_absences=models.Sum(
 35                                     models.Case(
 36                                         models.When(absence__type='Excused', then=1),
 37                                     default=0,
 38                                     output_field=models.IntegerField()
 39                                 )))
 40 
 41                     def annotate(self, *args, **kwargs)
 42                         # 用于实现聚合group by查询
 43 
 44                         from django.db.models import Count, Avg, Max, Min, Sum
 45 
 46                         v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))
 47                         # SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id
 48 
 49                         v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)
 50                         # SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
 51 
 52                         v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)
 53                         # SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
 54 
 55                     def distinct(self, *field_names)
 56                         # 用于distinct去重
 57                         models.UserInfo.objects.values('nid').distinct()
 58                         # select distinct nid from userinfo
 59 
 60                         注:只有在PostgreSQL中才能使用distinct进行去重
 61 
 62                     def order_by(self, *field_names)
 63                         # 用于排序
 64                         models.UserInfo.objects.all().order_by('-id','age')
 65 
 66                     def extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
 67                         # 构造额外的查询条件或者映射,如:子查询
 68                         
 69                         UserInfo.objects.extra(where=['headline ? %s'], params=['Lennon'])
 70                         # select * from userinfo where headline > 'Lennon'
 71                         
 72                         UserInfo.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
 73                         # select * from userinfo where (foo='a' OR bar = 'a') and baz = 'a'
 74                         
 75                         UserInfo.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
 76                             """
 77                             select 
 78                                 id,
 79                                 name,
 80                                 (select col from sometable where othercol > 1) as new_id
 81                             """
 82                         UserInfo.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
 83 
 84                      def reverse(self):
 85                         # 倒序
 86                         models.UserInfo.objects.all().order_by('-nid').reverse()
 87                         # 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序
 88 
 89 
 90                      def defer(self, *fields):
 91                         models.UserInfo.objects.defer('username','id')
 92  93                         models.UserInfo.objects.filter(...).defer('username','id')
 94                         #映射中排除某列数据
 95 
 96                      def only(self, *fields):
 97                         #仅取某个表中的数据
 98                          models.UserInfo.objects.only('username','id')
 99 100                          models.UserInfo.objects.filter(...).only('username','id')
101 
102                      def using(self, alias):
103                          指定使用的数据库,参数为别名(setting中的设置)
104                          
105                          models.UserInfo.objects.filter(id=5).using('db1')
106 
107 
108                     ##################################################
109                     # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
110                     ##################################################
111 
112                     def raw(self, raw_query, params=None, translatiOns=None, using=None):
113                         # 执行原生SQL
114                         models.UserInfo.objects.raw('select * from userinfo where id > 10 ')
115 
116                         # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
117                         models.UserInfo.objects.raw('select id as nid from 其他表')
118 
119                         # 为原生SQL设置参数
120                         models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])
121 
122                         # 将获取的到列名转换为指定列名
123                         name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
124                         Person.objects.raw('SELECT * FROM some_other_table', translatiOns=name_map)
125 
126                         # 指定数据库
127                         models.UserInfo.objects.raw('select * from userinfo', using="default")
128 
129                     ################### 原生SQL ###################
130                     from django.db import connection, connections
131                     cursor = connection.cursor()  # cursor = connections['default'].cursor()
132                     cursor.execute("""SELECT * from auth_user where id = %s""", [1])
133                     row = cursor.fetchone() # fetchall()/fetchmany(..)
134 
135 
136                     def values(self, *fields):
137                         # 获取每行数据为字典格式
138 
139                     def values_list(self, *fields, **kwargs):
140                         # 获取每行数据为元祖
141 
142                     def dates(self, field_name, kind, order='ASC'):
143                         # 根据时间进行某一部分进行去重查找并截取指定内容
144                         # kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)
145                         # order只能是:"ASC"  "DESC"
146                         # 并获取转换后的时间
147                             - year : 年-01-01
148                             - month: 年-月-01
149                             - day  : 年-月-150 
151                         models.DatePlus.objects.dates('ctime','day','DESC')
152 
153                     def datetimes(self, field_name, kind, order='ASC', tzinfo=None):
154                         # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
155                         # kind只能是 "year", "month", "day", "hour", "minute", "second"
156                         # order只能是:"ASC"  "DESC"
157                         # tzinfo时区对象
158                         models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
159                         models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))
160 
161                         """
162                         pip3 install pytz
163                         import pytz
164                         pytz.all_timezones
165                         pytz.timezone(‘Asia/Shanghai’)
166                         """
167 
168                     def none(self):
169                         # 空QuerySet对象
170 
171 
172                     ####################################
173                     # METHODS THAT DO DATABASE QUERIES #
174                     ####################################
175 
176                     def aggregate(self, *args, **kwargs):
177                        # 聚合函数,获取字典类型聚合结果
178                        from django.db.models import Count, Avg, Max, Min, Sum
179                        result = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid'))
180                        ===> {'k': 3, 'n': 4}
181 
182                     def count(self):
183                        # 获取个数
184 
185                     def get(self, *args, **kwargs):
186                        # 获取单个对象
187 
188                     def create(self, **kwargs):
189                        # 创建对象
190 
191                     def bulk_create(self, objs, batch_size=None):
192                         # 批量插入
193                         # batch_size表示一次插入的个数
194                         objs = [
195                             models.DDD(name='r11'),
196                             models.DDD(name='r22')
197                         ]
198                         models.DDD.objects.bulk_create(objs, 10)
199 
200                     def get_or_create(self, defaults=None, **kwargs):
201                         # 如果存在,则获取,否则,创建
202                         # defaults 指定创建时,其他字段的值
203                         obj, created = models.UserInfo.objects.get_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 2})
204 
205                     def update_or_create(self, defaults=None, **kwargs):
206                         # 如果存在,则更新,否则,创建
207                         # defaults 指定创建时或更新时的其他字段
208                         obj, created = models.UserInfo.objects.update_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 1})
209 
210                     def first(self):
211                        # 获取第一个
212 
213                     def last(self):
214                        # 获取最后一个
215 
216                     def in_bulk(self, id_list=None):
217                        # 根据主键ID进行查找
218                        id_list = [11,21,31]
219                        models.DDD.objects.in_bulk(id_list)
220                        
221                        models.User.objects.filter(id__in=[11,21,31])
222 
223                     def delete(self):
224                        # 删除
225 
226                     def update(self, **kwargs):
227                         # 更新
228 
229                     def exists(self):
230                        # 是否有结果

 


推荐阅读
  • 本文深入分析了Django框架中模型应用与非模型应用的区别与应用场景,详细对比了两者在数据处理、性能表现及开发灵活性等方面的特点。同时,文章还介绍了如何在视图函数中有效利用这些特性,结合PostgreSQL、MySQL、SQLite3和Oracle等不同数据库的配置与使用方法,为开发者提供了全面的参考指南。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 在第六章中,我们将深入探讨MySQL中的多表查询技术,包括联结查询和子查询。联结查询通过将两个或多个表进行连接,基于连接条件生成结果集。常见的联结类型有内联结、外联结和全外联结。交叉联结(CROSS JOIN)虽然使用较少,但其原理是生成所有可能的组合,类似于笛卡尔积的概念。此外,子查询则是在一个查询语句中嵌套另一个查询,用于获取更复杂的数据集。本章将通过实例详细讲解这些查询方法的应用和优化技巧。 ... [详细]
  • 本文深入探讨了 iOS 开发中 `int`、`NSInteger`、`NSUInteger` 和 `NSNumber` 的应用与区别。首先,我们将详细介绍 `NSNumber` 类型,该类用于封装基本数据类型,如整数、浮点数等,使其能够在 Objective-C 的集合类中使用。通过分析这些类型的特性和应用场景,帮助开发者更好地理解和选择合适的数据类型,提高代码的健壮性和可维护性。苹果官方文档提供了更多详细信息,可供进一步参考。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 本课程详细介绍了如何使用Python Flask框架从零开始构建鱼书应用,涵盖高级编程技巧和实战项目。通过视频教学,学员将学习到Flask的高效用法,包括数据库事务处理和书籍交易模型的实现。特别感谢AI资源网提供的课程下载支持。 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • 在Unity3D的第13天学习中,我们深入探讨了关节系统和布料模拟技术。关节系统作为Unity中的关键物理组件,能够实现游戏对象间的动态连接,如刚体间的关系、门的开合动作以及角色的布娃娃效果。铰链关节涉及两个刚体的交互,能够精确模拟复杂的机械运动,为游戏增添了真实感。此外,布料模拟技术则进一步提升了角色衣物和环境装饰物的自然表现,增强了视觉效果的真实性和沉浸感。 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • MySQL日志分析在应急响应中的应用与优化策略
    在应急响应中,MySQL日志分析对于检测和应对数据库攻击具有重要意义。常见的攻击手段包括弱口令、SQL注入、权限提升和备份数据窃取。通过对MySQL日志的深入分析,不仅可以及时发现潜在的攻击行为,还能详细还原攻击过程并追踪攻击源头。此外,优化日志记录和分析策略,能够提高安全响应效率,增强系统的整体安全性。 ... [详细]
  • Django项目中配置媒体文件路径的详细步骤与最佳实践
    在Django项目中配置媒体文件路径的详细步骤包括:首先,创建一个新的应用(如 `app02`),然后在 `settings.py` 文件中配置媒体文件的存储路径。具体来说,需要导入 `os` 模块,并使用 `os.path.join` 方法来指定媒体文件的保存目录。此外,建议在开发和生产环境中分别设置不同的媒体文件路径,以确保项目的灵活性和安全性。为了更好地管理和访问媒体文件,还可以在 `urls.py` 中添加相应的URL配置,以便在开发服务器上直接访问这些文件。 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 使用Boost.Asio进行异步数据处理的应用程序主要依赖于两个核心概念:I/O服务和I/O对象。I/O服务抽象了操作系统接口,使得异步操作能够高效地执行。I/O对象则代表了具体的网络资源,如套接字和文件描述符,通过这些对象可以实现数据的读写操作。本文详细介绍了这两个概念在Boost.Asio中的应用及其在网络编程中的重要性。 ... [详细]
author-avatar
p欧阳宏生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有