热门标签 | 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                        # 是否有结果

 


推荐阅读
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文介绍如何使用 Python 的 xlrd 库读取 Excel 文件,并将其数据处理后存储到数据库中。通过实际案例,详细讲解了文件路径、合并单元格处理等常见问题。 ... [详细]
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社区 版权所有