Loading

python/ORM操作详解

一、python/ORM操作详解

===================增====================
models.UserInfo.objects.create(title='alex')
1 # def gets(request):
2 #     models.UserInfo.objects.create(id=2,title='alex')
3 #     #向数据库增加一条数据(参数可以接收字典)
增 演示
===================删====================
models.UserInfo.objects.filter(id=2).delete()
1 # def gets(request):
2 #     models.UserInfo.objects.filter(id=2).delete()
3 #     #删除id等于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
改 演示
===================查====================
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 起始位置和结束位置
查 演示
====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)
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的关系
 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)
Q 演示
======================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并以降序排列
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
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
原生SQL 演示
===================其他方法===================
  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 # 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     # obj = models.UserType.objects.all().last()
2     # print('用户类型',obj)
3     # for row in obj.userinfo_set.all():
4     #     print(row.name,row.age)
对象反向 演示
================字典正向查找==================
1     # models.UserInfo.objects.filter(id__gt=7).delete()
2     # v=models.UserInfo.objects.all().values('name','age','ut__title')
3     # print(v)
字典正向 演示
===================字典反向查找======================
1     # vv = models.UserType.objects.values('title','userinfo__name')
2     # print(vv)
对象反向 演示
==================元组正向查找===================
1     # v3 = models.UserInfo.objects.all().values_list('name','age','ut__title')
2     # print(v3)
元组正向 演示
==================元组反向查找===================
1     # v4 = models.UserType.objects.all().values_list('title','userinfo__name')
2     # print(v4)
元组反向 演示
===============对象查看及连表==================
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     # 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     # 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     # 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('....')
排序 演示

 

 

 

posted @ 2017-06-27 23:11  Meet~  阅读(481)  评论(0编辑  收藏  举报