python/ORM操作详解

时间:2022-03-14 09:02:43

一、python/ORM操作详解

===================增====================
models.UserInfo.objects.create(title='alex')
 # def gets(request):
# models.UserInfo.objects.create(id=2,title='alex')
# #向数据库增加一条数据(参数可以接收字典)

增 演示

===================删====================
models.UserInfo.objects.filter(id=2).delete()
 # def gets(request):
# models.UserInfo.objects.filter(id=2).delete()
# #删除id等于2的一行数据

删 演示

===================改====================
models.UserInfo.objects.filter(id=1).update(name='egon')
 # def gets(request):
# models.UserInfo.objects.filter(id=1).update(name='egon')
# #修改id等于1的name为egon

改 演示

===================查====================
models.UserInfo.objects.all()
 def gets(request):
# models.UserInfo.objects.all()
# # 查看全部行的数据 # models.UserInfo.objects.filter(id=2)
# #查看id等于2的哪行数据 # models.UserInfo.objects.first()
# #查看第一个数据 # models.UserInfo.objects.last()
# #查看最后一个数据 # models.UserInfo.objects.exclude(id=4)
# #查看id不等于4的所有内容 # models.UserInfo.objects.filter(name='seven').count()
# #获取名字等于seven的总数 # models.UserInfo.objects.get(name='seven')
# #获取名字等于seven的单个对象 # models.UserInfo.objects.filter(id_gt=1)
# #查看id大于1的行内容 # models.UserInfo.objects.filter(id_lt=2)
# #查看id小于2的行内容 # models.UserInfo.objects.filter(id_gte=1)
# #查看id大于等于1的行内容 # models.UserInfo.objects.filter(id_let=5)
# #查看id小于等于5的行内容 # models.UserInfo.objects.filter(id_lt=10,id_gt=1)
# #查看id大于1且id小于10的行内容 # models.UserInfo.objects.filter(id__in=[11,33,44])
# #查看id在不在列表中 # models.UserInfo.objects.exclude(id_in=[11,33,44])
# #查看id不在列表中的的数据内容 # models.UserInfo.objects.filter(pud_date__isnull=True)
# #查看pud_date不是为空 # models.UserInfo.objects.filter(name__contains='alex')
# #查看名字中列中包含alex的数据内容 # models.UserInfo.objects.exclude(name__icontains='alex')
# #查看名字中列中包含alex(大小写不敏感)的数据内容 # models.UserInfo.objects.filter(ut_id__range=[1,5])
# #范围(bettwen end) # models.UserInfo.objects.filter(name__startswith='alex')
# #查看名字以alex开头的数据行 # models.UserInfo.objects.filter(name__istartswith='alex')
# #查看名字以alex开头(大小写不敏感)的数据行 # models.UserInfo.objects.filter(name__endswith='egon')
# #查看名字以egon结尾的数据行 # models.UserInfo.objects.filter(name__iendswith='egon')
# #查看名字以egon(大小写不敏感)的数据行 # models.UserInfo.objects.all().order_by('-id')
# #以降序进行排列查看 # models.UserInfo.objects.all().order_by('id')
# #以升序进行排列查看(默认使用升序) # models.UserInfo.objects.all()[1:4]
# #分页limit offset 起始位置和结束位置

查 演示

====F更新时对比之前的内容(在原来的值中更新)====
models.UserInfo.objects.all().update(age=F('age')+1)
 # from django.db.models import F
# models.UserInfo.objects.all().update(age=F('age')+1)

F 演示

====Q用于构造复杂查询条件====
# Q(nid__gt=10)
# #创建一个Q
# Q(nid=8) | Q(nid__gt=10)
# #俩个Q是或的关系
# Q(nid=8) & Q(nid__gt=10)
# #俩个Q是与的关系
# Q(nid=8) | Q(nid__gt=10) & Q(nid=7)
# #Q8 和 Q7 或 Q10 和 Q7的关系
 #方法一:
# Q(nid__gt=10)
# #创建一个Q
# Q(nid=8) | Q(nid__gt=10)
# #俩个Q是或的关系
# Q(nid=8) & Q(nid__gt=10)
# #俩个Q是与的关系
# Q(nid=8) | Q(nid__gt=10) & Q(nid=7)
# #Q8 和 Q7 或 Q10 和 Q7的关系 #方法二:
# from django.db.models import Q
# q1=Q()
# q1.connector='OR'
# q1.children.append(('id_gt',1))
# q1.children.append(('id',10))
# q1.children.append(('id',9))
#
# q2=Q()
# q2.connector='OR'
# q2.children.append(('c1',2))
# q2.children.append(('c1',10))
# q2.children.append(('c1',9))
#
# q3=Q()
# q3.connector='AND'
# q3.children.append(('id',1))
# q3.children.append(('id',2))
# q2.add(q3,'OR')
#
# con=Q()
# con.add(q1,'AND')
# con.add(q2,'AND')
#
# models.UserInfo.objects.filter(con)

Q 演示

======================extra========================
models.UserInfo.objects.extra(where=['headline=%s'],params=[1,])
 # def gets(request):
# models.UserInfo.objects.extra(where=['headline=%s'],params=[1,])
# #where 和 params 配合使用
# models.UserInfo.objects.extra(where=["foo='a' OR bar='a',baz='a"])
# #查询条件是foo和baz等于a 或者bar和baz等a
# models.UserInfo.objects.extra(select={'new_id':"select id from tb where id>%s"},select_params=(1,),order_by=['-nid'])
# #查询id大于1并以降序排列

extra 演示

===================执行原生SQL语句===================
# from django.db import connection,connections
# cursor = connection.cursor()
# #默认是连接存放数据库的列表中第一个库
# cursor = connections['dbs'].cursor()
# #指定连接数据库(写的数据库名必须是存放数据库的列表中有点)
# cursor.execute("select * from appo1_foo where id=%s",[1,])
# #发送SQL语句进行查询
# row = cursor.fetchone()
# #获取数据库中一行内容赋值给row
 # from django.db import connection,connections
# cursor = connection.cursor()
# #默认是连接存放数据库的列表中第一个库
# cursor = connections['dbs'].cursor()
# #指定连接数据库(写的数据库名必须是存放数据库的列表中有点)
# cursor.execute("select * from appo1_foo where id=%s",[1,])
# #发送SQL语句进行查询
# row = cursor.fetchone()
# #获取数据库中一行内容赋值给row

原生SQL 演示

===================其他方法===================
 # def all(self):
#获取所有数据对象 # #def filter(self,*args,**kwargs)
#条件查询
#条件查询可以是:参数,字典,Q #def exclude(self,*args,**kwargs)
#条件查询
#条件可以是: 参数,字典,Q #def annotate(self,*args,**kwargs):
#用于实现聚合group by查询
from django.db.models import Count,Avg,Max,Min,Sum
# v = models.UserInfo.objects.values('ut_id').annotate(wsa=Count('ut_id'))
# print(v.query)
# '''
#
# SELECT "appo1_userinfo"."ut_id", COUNT("appo1_userinfo"."ut_id") AS "uid" FROM "appo1_userinfo" GROUP BY "appo1_userinfo"."ut_id"
#
# ''' # v = models.UserInfo.objects.values('ut_id').annotate(wws=Count('ut_id')).filter(ut_id__gt=2)
# print(v.query) # ''' # SELECT "appo1_userinfo"."ut_id", COUNT("appo1_userinfo"."ut_id") AS "wws" FROM "appo1_userinfo" WHERE "appo1_userinfo"."ut_id" > 2 GROUP BY "appo1_userinfo"."ut_id"
# # '''
# v = models.UserInfo.objects.filter(ut_id__gt=2).values().annotate(mm=Count('ut_id')).filter(ut_id__gt=2)
# print(v.query) # '''
# SELECT "appo1_userinfo"."id", "appo1_userinfo"."name", "appo1_userinfo"."age", "appo1_userinfo"."ut_id", COUNT("appo1_userinfo"."ut_id") AS "mm" FROM "appo1_userinfo" WHERE ("appo1_userinfo"."ut_id" > 2 AND "appo1_userinfo"."ut_id" > 2) GROUP BY "appo1_userinfo"."id", "appo1_userinfo"."name", "appo1_userinfo"."age", "appo1_userinfo"."ut_id"
# ''' # v= models.UserInfo.objects.values('ut_id').distinct()
#进行去重
# print(v.query) # '''
# SELECT DISTINCT "appo1_userinfo"."ut_id" FROM "appo1_userinfo"
# ''' #注:只有在PostgresSQL中才能使用distinct进行去重
#如果是PostgresSQL
# models.UserInfo.objects.distinct('nid') # def extra(self,select=None,where=None,params=None,tables=None,order_by=None,select_params=None)
# where ---------params
# select ----------select_params # models.UserInfo.objects.all().order_by('-id').reverse() #将设置里降序的进行反转成升序
# ss=models.UserInfo.objects.filter(id=2,age=14).order_by('-id','age')
# print(ss.query)
# SELECT "appo1_userinfo"."id", "appo1_userinfo"."name", "appo1_userinfo"."age", "appo1_userinfo"."ut_id" FROM "appo1_userinfo" WHERE ("appo1_userinfo"."id" = 2 AND "appo1_userinfo"."age" = 14) ORDER BY "appo1_userinfo"."id" DESC, "appo1_userinfo"."age" ASC # ss =models.UserInfo.objects.all().order_by('-id','age').reverse()
# print(ss.query)
# '''
# SELECT "appo1_userinfo"."id", "appo1_userinfo"."name", "appo1_userinfo"."age", "appo1_userinfo"."ut_id" FROM "appo1_userinfo" ORDER BY "appo1_userinfo"."id" ASC, "appo1_userinfo"."age" DESC
#
# ''' # ss=models.UserInfo.objects.defer('age','ut_id')
# #映射中排除某列数据
# for i in ss:
# print(i.id) # sss=models.UserInfo.objects.filter(id=2).defer('age','ut_id')
# #查看id等于2且排除某列数据的
# for i in sss:
# print(i.id) # sss=models.UserInfo.objects.all().only('age')
#仅取某列数据
# for i in sss:
# print(i.age) # models.UserInfo.objects.using('dbx')
#指定使用的数据库,参数为存放数据中的数据库名
# ss=models.UserInfo.objects.raw('select * from appo1_userinfo')
# print(ss) # models.UserInfo.objects.values('ut_id')
#获取到列表中存放的字典 # models.UserInfo.objects.values_list('ut_id')
#获取到列表中存放的元组 # models.UserInfo.objects.dates('ctime','day','DESC')
#根据时间进行某一部分进行去查找并截取指定内容 (参数 表行 时间格式 排方式)
#kind 只能是 year(年) month(年-月)day(年-月-日)
#order 只能是 ASC DESC (排序方式)
#并获取转换后的时间
# year 年 01 01
# month 年 月 01
# day 年 月 日 # models.UserInfo.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
#根据时间进行某一部分查找并截取指定内容,将时间转换为指定时区时间
#kind只能是 year month day hour minute second
#order只能是 ASC DESC 排序方式
#tzinfo 时区对象
# models.UserInfo.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))
# '''
# 安装 pythz pip3 install pytz
# import pytz
# pytz.all_timezones
# pytz.timezone('Asia/Shanghai')
# ''' # def none(self):
# #空QuesySet
# pass # ss=models.UserInfo.objects.aggregate(k=Count('ut_id',distinct=True),n=Count('id'))
#{'k': 3, 'n': 7}
# print(ss) # ogj=[
# models.UserInfo(name='alex'),
# models.UserInfo(name='egon')
#
# ]
# models.UserInfo.objects.bulk_create(ogj,10)
#批量插入数据 10代表没次插入数量 # obj,creted = models.UserInfo.objects.get_or_create(username='roo1',defaults={'email':'11111','u_id':2,'tid':3})
#先查看如果存在就不执行创建的操作,如果不存在就会创建后边的数据 # obj,creted = models.UserInfo.objects.update_or_create(username='roo1',defaults={'email':'11111','u_id':2,'tid':3})
#先查如果存在就不执行更新,如果不存在就会创建后边的数据 # id=[11,222,333]
# models.UserInfo.objects.in_bulk(id)
#根据主键ID进行查找 # ss = models.UserInfo.objects.exists()
# #查看是否有结果
# print(ss) return HttpResponse('....')

其他 演示

====================对象正向查找===================
 # result = models.UserInfo.objects.all()
# for obj in result:
# print(obj.name,obj.age,obj.ut_id,obj.ut.title)
##打印obj对象的名字,对象的年龄,对象的外键,ut设置外键的列就是相当于ut表对应的主键(现在拿到就是ut那个表可以拿ut对应的一行所有内容)
# result = models.UserInfo.objects.all().first()
# ##获取表中所有的行但只是拿第一个对象,也就是第一行
# print(result.name,result.age,result.ut)

对象正向 演示

==================对象反向查找=====================
     # obj = models.UserType.objects.all().last()
# print('用户类型',obj)
# for row in obj.userinfo_set.all():
# print(row.name,row.age)

对象反向 演示

================字典正向查找==================
     # models.UserInfo.objects.filter(id__gt=7).delete()
# v=models.UserInfo.objects.all().values('name','age','ut__title')
# print(v)

字典正向 演示

===================字典反向查找======================
     # vv = models.UserType.objects.values('title','userinfo__name')
# print(vv)

对象反向 演示

==================元组正向查找===================
     # v3 = models.UserInfo.objects.all().values_list('name','age','ut__title')
# print(v3)

元组正向 演示

==================元组反向查找===================
     # v4 = models.UserType.objects.all().values_list('title','userinfo__name')
# print(v4)

元组反向 演示

===============对象查看及连表==================
     # models.UserInfo.objects.all()
#查看UserIinfo表的所有行
# models.UserInfo.objects.filter(id=2)
##查看UserInfo表id等于2的哪一行内容
# result = models.UserInfo.objects.all()
##通过此方式返回一个列表中存放的是对象(object)
# for row in result:
# print(row.name,row.id,row.age,row.ut.title)
##以是对象的方式进行连表

对象连表 演示

==================字典查看及连表===================
     # models.UserInfo.objects.all()
## 查看表的所有行
# models.UserInfo.objects.filter(id=1)
##查看表的id是1的行
# result=models.UserInfo.objects.all().values('id','name','ut__title')
##通过此方式连表返回个列表,列表中存放的是字典对象(dict)
# for row in result:
# print(row)

字典连表

=================元组查看及连表==================
     # models.UserInfo.objects.all()
## 查看表的所有行
# models.UserInfo.objects.filter(id=2)
##查看表的id是2的行
# result=models.UserInfo.objects.all().values_list('id','name','ut__title')
##通过此方式连表返回个列表,列表中存放的是元组对象(tuple)
# for row in result:
# print(row)

元组连表

=====================排序========================
     # user_list = models.UserInfo.objects.all().order_by('-id')
# ##排序默认的升序,order_by('-id')是降序
# for i in user_list:
# print(i.name,i.id)
# return HttpResponse('....')

排序 演示

 

 

python/ORM操作详解的更多相关文章

  1. python第七篇:Python 列表操作详解

    Python列表操作详解 list函数 list()   #生成一个空的列表 list(iterable)  #用可迭代对象初始化一个列表 列表的 and 运算和 or 运算 列表and运算 > ...

  2. Python字符串操作详解

    菜鸟学Python第五天 流程控制 for循环 while循环 VS for循环: while循环:称之为条件循环,循环的次数取决于条件何时为false for循环:称之为迭代器循环,循环的次数取决于 ...

  3. Python文件操作详解

    Python内置了一个open()方法,用于对本地文件进行读写操作.这个功能简单.实用,属于必须掌握的基础知识. 使用open方法操作文件可以分三步走,一是打开文件,二是操作文件,三是关闭文件.下面分 ...

  4. Python——文件操作详解

    python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...

  5. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

  6. ORM 对表操作 详解

    目录 ORM对表操作详解 表结构 ORM对表的 增 删 改 查 基于对象的跨表查询 -- 类似于子查询 基于双下划的跨表查询 -- 连表 join ORM对表的操作示例 正向查 与 反向查 relat ...

  7. Python对Excel操作详解

      Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd.xlwt和xlutils模块.另外还演示了如何通过Tcl   ...

  8. Python 字符串方法详解

    Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息.        ...

  9. Python中dict详解

    from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...

随机推荐

  1. LINQ to SQL语句(11)之Update

    说明:更新操作,先获取对象,进行修改操作之后,直接调用SubmitChanges()方法即可提交.注意,这里是在同一个DataContext中,对于不同的DataContex看下面的讲解. 1.简单形 ...

  2. 如何一次把所有wordpress插件都禁用了

    wordpress网站出现了问题,或者在更新一些数据的时候,需要先把插件全部都禁用了进行检查.那么如何一次把所有wordpress插件都禁用呢?试试下面的sql语句吧 UPDATE wp_option ...

  3. Spring发送电子邮件

      Spring提供了发送电子邮件的功能,它向用户屏蔽了底层邮件系统的一些细节,同时代表客户端负责底层的资源处理. Spring的邮件服务支持主要是通过JavaMailSender这个接口实现的: p ...

  4. Mac中使用svn进行项目管理

    Mac中使用svn进行项目管理,借鉴了http://blog.csdn.net/q199109106q/article/details/8655204 下面方案多人亲測可用 转载请注明出处:http: ...

  5. js 监控iframe URL的变化

    iframe的url可以前端任何地址,这样就可能出现漏洞,如果钓鱼网站通过js把src改成了危险地址,如果没有监控,就会有很大隐患.所以监控iframe的url变化就是必须要解决的问题了. 第一印象的 ...

  6. Moco服务器jar包实现简易的API搭建

    永远不要停止前进的脚步,就像你不会忘记以前那些窘迫的连一无所有都称不上的裸露的记忆一样.追求永远的打怪升级,武装自己.双手的努力让曾经那些不堪的记忆在时间的长河中渐渐风化隐匿,但请不要忘记它留下的那一 ...

  7. VS2017中 C# dll引用(C生成dll,C++生成dll)小结 - 简书

    原文:VS2017中 C# dll引用(C生成dll,C++生成dll)小结 - 简书 dll引用小结 一.dll与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library” ...

  8. react+redux+react-router+node.js 开发实时聊天App 学习记录

    一.课程导学 1.React 主要解决的是UI层的问题,应用的状态需要借助Redux等状态管理. 2.前端React  +  antd-mobile UI组件库 + Redux 状态管理库 + Rea ...

  9. [leetcode]Rotate Image @ Python

    原题地址:https://oj.leetcode.com/problems/rotate-image/ 题意: You are given an n x n 2D matrix representin ...

  10. 如何使用Defender优雅的管理权限?

    何为权限管理 权限管理已经不知不觉深入到了我们生活的每一个角落,例如地铁进站的闸机,高速公路上的过路费,停车场的杠杆等等等等. 作为一名开发人员,权限二字对我们的映像更加深刻,无论任何系统,都多多少少 ...