django ORM操作详解
一、python/ORM操作详解
|
1
2
|
===================增====================models.UserInfo.objects.create(title='alex') |
1 # def gets(request): 2 # models.UserInfo.objects.create(id=2,title='alex') 3 # #向数据库增加一条数据(参数可以接收字典)
|
1
2
|
===================删====================models.UserInfo.objects.filter(id=2).delete() |
1 # def gets(request): 2 # models.UserInfo.objects.filter(id=2).delete() 3 # #删除id等于2的一行数据
|
1
2
|
===================改====================models.UserInfo.objects.filter(id=1).update(name='egon') |
1 # def gets(request): 2 # models.UserInfo.objects.filter(id=1).update(name='egon') 3 # #修改id等于1的name为egon
|
1
2
|
===================查====================models.UserInfo.objects.all() |
1 def gets(request):
2 # models.UserInfo.objects.all()
3 # # 查看全部行的数据
4
5 # models.UserInfo.objects.filter(id=2)
6 # #查看id等于2的哪行数据
7
8 # models.UserInfo.objects.first()
9 # #查看第一个数据
10
11 # models.UserInfo.objects.last()
12 # #查看最后一个数据
13
14 # models.UserInfo.objects.exclude(id=4)
15 # #查看id不等于4的所有内容
16
17 # models.UserInfo.objects.filter(name='seven').count()
18 # #获取名字等于seven的总数
19
20 # models.UserInfo.objects.get(name='seven')
21 # #获取名字等于seven的单个对象
22
23 # models.UserInfo.objects.filter(id_gt=1)
24 # #查看id大于1的行内容
25
26 # models.UserInfo.objects.filter(id_lt=2)
27 # #查看id小于2的行内容
28
29 # models.UserInfo.objects.filter(id_gte=1)
30 # #查看id大于等于1的行内容
31
32 # models.UserInfo.objects.filter(id_let=5)
33 # #查看id小于等于5的行内容
34
35 # models.UserInfo.objects.filter(id_lt=10,id_gt=1)
36 # #查看id大于1且id小于10的行内容
37
38 # models.UserInfo.objects.filter(id__in=[11,33,44])
39 # #查看id在不在列表中
40
41 # models.UserInfo.objects.exclude(id_in=[11,33,44])
42 # #查看id不在列表中的的数据内容
43
44 # models.UserInfo.objects.filter(pud_date__isnull=True)
45 # #查看pud_date不是为空
46
47 # models.UserInfo.objects.filter(name__contains='alex')
48 # #查看名字中列中包含alex的数据内容
49
50 # models.UserInfo.objects.exclude(name__icontains='alex')
51 # #查看名字中列中包含alex(大小写不敏感)的数据内容
52
53 # models.UserInfo.objects.filter(ut_id__range=[1,5])
54 # #范围(bettwen end)
55
56 # models.UserInfo.objects.filter(name__startswith='alex')
57 # #查看名字以alex开头的数据行
58
59 # models.UserInfo.objects.filter(name__istartswith='alex')
60 # #查看名字以alex开头(大小写不敏感)的数据行
61
62 # models.UserInfo.objects.filter(name__endswith='egon')
63 # #查看名字以egon结尾的数据行
64
65 # models.UserInfo.objects.filter(name__iendswith='egon')
66 # #查看名字以egon(大小写不敏感)的数据行
67
68 # models.UserInfo.objects.all().order_by('-id')
69 # #以降序进行排列查看
70
71 # models.UserInfo.objects.all().order_by('id')
72 # #以升序进行排列查看(默认使用升序)
73
74 # models.UserInfo.objects.all()[1:4]
75 # #分页limit offset 起始位置和结束位置
|
1
2
|
====F更新时对比之前的内容(在原来的值中更新)====models.UserInfo.objects.all().update(age=F('age')+1) |
1 # from django.db.models import F
2 # models.UserInfo.objects.all().update(age=F('age')+1)
|
1
2
3
4
5
6
7
8
9
|
====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的关系 |
1 #方法一:
2 # Q(nid__gt=10)
3 # #创建一个Q
4 # Q(nid=8) | Q(nid__gt=10)
5 # #俩个Q是或的关系
6 # Q(nid=8) & Q(nid__gt=10)
7 # #俩个Q是与的关系
8 # Q(nid=8) | Q(nid__gt=10) & Q(nid=7)
9 # #Q8 和 Q7 或 Q10 和 Q7的关系
10
11 #方法二:
12 # from django.db.models import Q
13 # q1=Q()
14 # q1.connector='OR'
15 # q1.children.append(('id_gt',1))
16 # q1.children.append(('id',10))
17 # q1.children.append(('id',9))
18 #
19 # q2=Q()
20 # q2.connector='OR'
21 # q2.children.append(('c1',2))
22 # q2.children.append(('c1',10))
23 # q2.children.append(('c1',9))
24 #
25 # q3=Q()
26 # q3.connector='AND'
27 # q3.children.append(('id',1))
28 # q3.children.append(('id',2))
29 # q2.add(q3,'OR')
30 #
31 # con=Q()
32 # con.add(q1,'AND')
33 # con.add(q2,'AND')
34 #
35 # models.UserInfo.objects.filter(con)
|
1
2
|
======================extra========================models.UserInfo.objects.extra(where=['headline=%s'],params=[1,]) |
1 # def gets(request):
2 # models.UserInfo.objects.extra(where=['headline=%s'],params=[1,])
3 # #where 和 params 配合使用
4 # models.UserInfo.objects.extra(where=["foo='a' OR bar='a',baz='a"])
5 # #查询条件是foo和baz等于a 或者bar和baz等a
6 # models.UserInfo.objects.extra(select={'new_id':"select id from tb where id>%s"},select_params=(1,),order_by=['-nid'])
7 # #查询id大于1并以降序排列
|
1
2
3
4
5
6
7
8
9
10
|
===================执行原生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 |
1 # from django.db import connection,connections
2 # cursor = connection.cursor()
3 # #默认是连接存放数据库的列表中第一个库
4 # cursor = connections['dbs'].cursor()
5 # #指定连接数据库(写的数据库名必须是存放数据库的列表中有点)
6 # cursor.execute("select * from appo1_foo where id=%s",[1,])
7 # #发送SQL语句进行查询
8 # row = cursor.fetchone()
9 # #获取数据库中一行内容赋值给row
|
1
|
===================其他方法=================== |
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 annotate(self,*args,**kwargs):
13 #用于实现聚合group by查询
14 from django.db.models import Count,Avg,Max,Min,Sum
15 # v = models.UserInfo.objects.values('ut_id').annotate(wsa=Count('ut_id'))
16 # print(v.query)
17 # '''
18 #
19 # SELECT "appo1_userinfo"."ut_id", COUNT("appo1_userinfo"."ut_id") AS "uid" FROM "appo1_userinfo" GROUP BY "appo1_userinfo"."ut_id"
20 #
21 # '''
22
23 # v = models.UserInfo.objects.values('ut_id').annotate(wws=Count('ut_id')).filter(ut_id__gt=2)
24 # print(v.query)
25
26 # '''
27
28 # 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"
29 #
30
31 # '''
32 # v = models.UserInfo.objects.filter(ut_id__gt=2).values().annotate(mm=Count('ut_id')).filter(ut_id__gt=2)
33 # print(v.query)
34
35 # '''
36 # 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"
37 # '''
38
39 # v= models.UserInfo.objects.values('ut_id').distinct()
40 #进行去重
41 # print(v.query)
42
43 # '''
44 # SELECT DISTINCT "appo1_userinfo"."ut_id" FROM "appo1_userinfo"
45 # '''
46
47 #注:只有在PostgresSQL中才能使用distinct进行去重
48 #如果是PostgresSQL
49 # models.UserInfo.objects.distinct('nid')
50
51
52
53 # def extra(self,select=None,where=None,params=None,tables=None,order_by=None,select_params=None)
54 # where ---------params
55 # select ----------select_params
56
57
58
59 # models.UserInfo.objects.all().order_by('-id').reverse()
60
61
62
63 #将设置里降序的进行反转成升序
64 # ss=models.UserInfo.objects.filter(id=2,age=14).order_by('-id','age')
65 # print(ss.query)
66 # 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
67
68
69
70 # ss =models.UserInfo.objects.all().order_by('-id','age').reverse()
71 # print(ss.query)
72 # '''
73 # 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
74 #
75 # '''
76
77
78
79 # ss=models.UserInfo.objects.defer('age','ut_id')
80 # #映射中排除某列数据
81 # for i in ss:
82 # print(i.id)
83
84
85 # sss=models.UserInfo.objects.filter(id=2).defer('age','ut_id')
86 # #查看id等于2且排除某列数据的
87 # for i in sss:
88 # print(i.id)
89
90
91
92 # sss=models.UserInfo.objects.all().only('age')
93 #仅取某列数据
94 # for i in sss:
95 # print(i.age)
96
97
98
99 # models.UserInfo.objects.using('dbx')
100 #指定使用的数据库,参数为存放数据中的数据库名
101 # ss=models.UserInfo.objects.raw('select * from appo1_userinfo')
102 # print(ss)
103
104
105
106 # models.UserInfo.objects.values('ut_id')
107 #获取到列表中存放的字典
108
109
110
111 # models.UserInfo.objects.values_list('ut_id')
112 #获取到列表中存放的元组
113
114
115
116 # models.UserInfo.objects.dates('ctime','day','DESC')
117 #根据时间进行某一部分进行去查找并截取指定内容 (参数 表行 时间格式 排方式)
118 #kind 只能是 year(年) month(年-月)day(年-月-日)
119 #order 只能是 ASC DESC (排序方式)
120 #并获取转换后的时间
121 # year 年 01 01
122 # month 年 月 01
123 # day 年 月 日
124
125
126
127 # models.UserInfo.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
128 #根据时间进行某一部分查找并截取指定内容,将时间转换为指定时区时间
129 #kind只能是 year month day hour minute second
130 #order只能是 ASC DESC 排序方式
131 #tzinfo 时区对象
132 # models.UserInfo.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))
133 # '''
134 # 安装 pythz pip3 install pytz
135 # import pytz
136 # pytz.all_timezones
137 # pytz.timezone('Asia/Shanghai')
138 # '''
139
140 # def none(self):
141 # #空QuesySet
142 # pass
143
144 # ss=models.UserInfo.objects.aggregate(k=Count('ut_id',distinct=True),n=Count('id'))
145 #{'k': 3, 'n': 7}
146 # print(ss)
147
148 # ogj=[
149 # models.UserInfo(name='alex'),
150 # models.UserInfo(name='egon')
151 #
152 # ]
153 # models.UserInfo.objects.bulk_create(ogj,10)
154 #批量插入数据 10代表没次插入数量
155
156
157 # obj,creted = models.UserInfo.objects.get_or_create(username='roo1',defaults={'email':'11111','u_id':2,'tid':3})
158 #先查看如果存在就不执行创建的操作,如果不存在就会创建后边的数据
159
160 # obj,creted = models.UserInfo.objects.update_or_create(username='roo1',defaults={'email':'11111','u_id':2,'tid':3})
161 #先查如果存在就不执行更新,如果不存在就会创建后边的数据
162
163
164 # id=[11,222,333]
165 # models.UserInfo.objects.in_bulk(id)
166 #根据主键ID进行查找
167
168
169 # ss = models.UserInfo.objects.exists()
170 # #查看是否有结果
171 # print(ss)
172
173 return HttpResponse('....')
|
1
|
====================对象正向查找=================== |
1 # result = models.UserInfo.objects.all() 2 # for obj in result: 3 # print(obj.name,obj.age,obj.ut_id,obj.ut.title) 4 ##打印obj对象的名字,对象的年龄,对象的外键,ut设置外键的列就是相当于ut表对应的主键(现在拿到就是ut那个表可以拿ut对应的一行所有内容) 5 # result = models.UserInfo.objects.all().first() 6 # ##获取表中所有的行但只是拿第一个对象,也就是第一行 7 # print(result.name,result.age,result.ut)
|
1
|
==================对象反向查找===================== |
1 # obj = models.UserType.objects.all().last()
2 # print('用户类型',obj)
3 # for row in obj.userinfo_set.all():
4 # print(row.name,row.age)
|
1
|
================字典正向查找================== |
1 # models.UserInfo.objects.filter(id__gt=7).delete()
2 # v=models.UserInfo.objects.all().values('name','age','ut__title')
3 # print(v)
|
1
|
===================字典反向查找====================== |
1 # vv = models.UserType.objects.values('title','userinfo__name')
2 # print(vv)
|
1
|
==================元组正向查找=================== |
1 # v3 = models.UserInfo.objects.all().values_list('name','age','ut__title')
2 # print(v3)
|
1
|
==================元组反向查找=================== |
1 # v4 = models.UserType.objects.all().values_list('title','userinfo__name')
2 # print(v4)
|
1
|
===============对象查看及连表================== |
1 # models.UserInfo.objects.all() 2 #查看UserIinfo表的所有行 3 # models.UserInfo.objects.filter(id=2) 4 ##查看UserInfo表id等于2的哪一行内容 5 # result = models.UserInfo.objects.all() 6 ##通过此方式返回一个列表中存放的是对象(object) 7 # for row in result: 8 # print(row.name,row.id,row.age,row.ut.title) 9 ##以是对象的方式进行连表
|
1
|
==================字典查看及连表=================== |
1 # models.UserInfo.objects.all()
2 ## 查看表的所有行
3 # models.UserInfo.objects.filter(id=1)
4 ##查看表的id是1的行
5 # result=models.UserInfo.objects.all().values('id','name','ut__title')
6 ##通过此方式连表返回个列表,列表中存放的是字典对象(dict)
7 # for row in result:
8 # print(row)
|
1
|
=================元组查看及连表================== |
1 # models.UserInfo.objects.all()
2 ## 查看表的所有行
3 # models.UserInfo.objects.filter(id=2)
4 ##查看表的id是2的行
5 # result=models.UserInfo.objects.all().values_list('id','name','ut__title')
6 ##通过此方式连表返回个列表,列表中存放的是元组对象(tuple)
7 # for row in result:
8 # print(row)
|
1
|
=====================排序======================== |
1 # user_list = models.UserInfo.objects.all().order_by('-id')
2 # ##排序默认的升序,order_by('-id')是降序
3 # for i in user_list:
4 # print(i.name,i.id)
5 # return HttpResponse('....')

浙公网安备 33010602011771号