ORM操作
一、单表、一对多表操作
1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(models.Model): 9 username = models.CharField(max_length=32) 10 password = models.CharField(max_length=64) 11 # age = models.IntegerField(null=True) 12 age = models.IntegerField(default=1) # 处理这种问题直接可以设置成空或者默认给个值 因为此时在数据库有数据 13 ug = models.ForeignKey("UserGroup", on_delete=models.CASCADE, null=True)
1 # 新增 2 # models.UserGroup.objects.create(title="销售部") 3 # models.UserInfo.objects.create(username='孙大圣', password='pwd', age=18, ug_id=1) 4 # 5 # 查找 6 # group_list = models.UserGroup.objects.all() # group_list是QuerySet类型 相当于一个列表 7 # for row in group_list: 8 # print(row.id, row.title) 9 # 10 # group_list = models.UserGroup.objects.filter(id=1) 11 # group_list = models.UserGroup.objects.filter(id__gt=1)#大于 12 # group_list = models.UserGroup.objects.filter(id__lt=1) #小于 13 # 14 # 删除 15 # models.UserGroup.objects.filter(id=2).delete() 16 # 17 # 更新 18 # models.UserGroup.objects.filter(id=2).update(title='公关部') 19 # filter里边的条件如果多个默认是and关系取 20 # models.UserType.objects.all().count()总数量 21 # models.UserType.objects.all().update()改 22 # models.UserType.objects.all().delete()删除 23 # models.UserType.objects.all()[1:10]
正反操作+高级+其它
1 # 获取个数 2 # 3 # models.Tb1.objects.filter(name='seven').count() 4 5 # 大于,小于 6 # 7 # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值 8 # models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值 9 # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值 10 # models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值 11 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 12 13 # in 14 # 15 # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 16 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in 17 18 # isnull 19 # Entry.objects.filter(pub_date__isnull=True) 20 21 # contains 22 # 23 # models.Tb1.objects.filter(name__contains="ven") 24 # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 25 # models.Tb1.objects.exclude(name__icontains="ven") 26 27 # range 28 # 29 # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and 30 31 # 其他类似 32 # 33 # startswith,istartswith, endswith, iendswith, 34 35 # order by 36 # 37 # models.Tb1.objects.filter(name='seven').order_by('id') # asc 38 # models.Tb1.objects.filter(name='seven').order_by('-id') # desc 39 40 # group by 41 # 42 # from django.db.models import Count, Min, Max, Sum 43 # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) 44 # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" 45 46 # limit 、offset 47 # 48 # models.Tb1.objects.all()[10:20] 49 50 # regex正则匹配,iregex 不区分大小写 51 # 52 # Entry.objects.get(title__regex=r'^(An?|The) +') 53 # Entry.objects.get(title__iregex=r'^(an?|the) +') 54 55 # date 56 # 57 # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1)) 58 # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1)) 59 60 # year 61 # 62 # Entry.objects.filter(pub_date__year=2005) 63 # Entry.objects.filter(pub_date__year__gte=2005) 64 65 # month 66 # 67 # Entry.objects.filter(pub_date__month=12) 68 # Entry.objects.filter(pub_date__month__gte=6) 69 70 # day 71 # 72 # Entry.objects.filter(pub_date__day=3) 73 # Entry.objects.filter(pub_date__day__gte=3) 74 75 # week_day 76 # 77 # Entry.objects.filter(pub_date__week_day=2) 78 # Entry.objects.filter(pub_date__week_day__gte=2) 79 80 # hour 81 # 82 # Event.objects.filter(timestamp__hour=23) 83 # Event.objects.filter(time__hour=5) 84 # Event.objects.filter(timestamp__hour__gte=12) 85 86 # minute 87 # 88 # Event.objects.filter(timestamp__minute=29) 89 # Event.objects.filter(time__minute=46) 90 # Event.objects.filter(timestamp__minute__gte=29) 91 92 # second 93 # 94 # Event.objects.filter(timestamp__second=31) 95 # Event.objects.filter(time__second=2) 96 # Event.objects.filter(timestamp__second__gte=31)
1 from django.db import models 2 3 4 class UserType(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(models.Model): 9 username = models.CharField(max_length=32) 10 password = models.CharField(max_length=64) 11 age = models.IntegerField() 12 ut = models.ForeignKey('UserType', on_delete=models.CASCADE) 13 14 def __str__(self): 15 return '%s--%s' % (self.id, self.username)
1 # 第一部分 连表操作 2 # from app01 import models 3 # 获取 4 # result = models.UserInfo.objects.all() 5 # .all .filter 都是QuerySet对象 [obj, obj] 里边放的就是数据库里边对应的每一行数据对象 6 # for obj in result: 7 # print(obj.username, obj.age, obj.ut_id, obj.ut.title) # 可以一直跨表下去但不要无限制 效率问题 8 9 # UserInfo ut字段外键FK 正向操作 10 # obj = models.UserInfo.objects.all().first() 11 # print(obj.username, obj.age, obj.ut.title) 12 13 # result = models.UserInfo.objects.all().values('id', 'username', 'ut__title') 14 # 里边放的字典对象 以下两种方式本质上不能跨表 但是在取数据的时候用双下划线也可以做到跨表查询 神奇的__ 15 # <QuerySet [{'id': 1, 'username': '孙大圣', 'ut__title': '牛逼用户'}, {'id': 2, 'username': '唐和尚', 'ut__title': '二笔用户'}]> 16 # for row in result: 17 # print(row['username'], row['ut__title']) 18 19 # result = models.UserInfo.objects.all().values_list('id', 'username') 20 # 里边放元组对象 21 # <QuerySet [(1, '孙大圣'), (2, '唐和尚'), (3, '猪八戒'), (4, '沙和尚')]> 22 # print(result) 23 24 25 # UserType 表名小写_set.all() 反向操作 26 # obj = models.UserType.objects.all().first() 27 # print(obj.id, obj.title, obj.userinfo_set.all()) 28 # for row in obj.userinfo_set.all(): 29 # print(row.id, row.username) 30 31 # result = models.UserType.objects.all() 32 # for item in result: 33 # print(item.title, item.userinfo_set.all()) 34 35 # obj = models.UserType.objects.all().first() 36 # result = obj.userinfo_set.all() 37 # print(result) 38 39 # models.UserType.objects.all().values('id', 'title') 40 # models.UserType.objects.all().filter('还可以先加条件').values('id', 'title', 'userinfo') # 正反向操作都是可以先加条件再干 41 # models.UserType.objects.all().values('id', 'title', 'userinfo__username') 42 # values_list也一样 谁在前边,那么前边的表就会显示完 跟mysql里边左右连接一样
1 # 高级操作 2 # F Q extra 3 # F操作 4 # from django.db.models import F, Q 5 # # F 批量对某个字段更新数据时用 6 # models.UserInfo.objects.all().update(age=F("age")+1) 7 # 8 # # Q 构造复杂的查询条件 9 # condition = { 10 # 'id': 1, 11 # 'username': 'root' 12 # } 13 # models.UserInfo.objects.filter(**condition) 14 # models.UserInfo.objects.filter(Q(id=1) | Q(id__gt=3)) 15 # models.UserInfo.objects.filter(Q(id=1) & Q(id__gt=3)) 16 # 17 # q1 = Q() 18 # q1.connector = 'OR' 19 # q1.children.append(('id__lt', 2)) 20 # q1.children.append(('id', 2)) 21 # q1.children.append(('id', 3)) 22 # 23 # q2 = Q() 24 # q2.connector = 'OR' 25 # q2.children.append(('a1', 3)) 26 # q2.children.append(('a2', 4)) 27 # q2.children.append(('a3', 1)) 28 # 29 # q3 = Q() 30 # q3.connector = 'AND' 31 # q3.children.append(('b1', 1)) 32 # q3.children.append(('b2', 2)) 33 # q1.add(q3, 'OR') 34 # 35 # con = Q() 36 # con.add(q1, 'AND') 37 # con.add(q2, 'AND') 38 # # (id = 1 or id=2 or id=3 or (b1=1 and b2=2)) and (a1=3 or a2=4 or a3=1) 39 # models.UserInfo.objects.filter(con) 40 # 41 # # extra(self, select=None, where=None, params=None, tables=None,order_by=None, select_params=None) 42 # v = models.UserInfo.objects.all().extra(select={'n': "select count(1) from app01_usertype where id>%s and id<%s"}, select_params=[1, 4], order_by=['-id']) 43 # for obj in v: 44 # print(obj.username, obj.id, obj.n) 45 # 46 # models.UserInfo.objects.extra( 47 # where=["id=1", "username='SB'"] 48 # ) 49 # models.UserInfo.objects.extra( 50 # where=["id=1 or id=%s", "username=%s"], 51 # params=[1, 'SB'] 52 # ) 53 # v = models.UserInfo.objects.extra( 54 # tables=['app01_usertype'], # 笛卡尔积 55 # where=['app01_usertype.id = app01_userinfo.ut_id'] # 加上这个条件又进一步的筛选 56 # ) 57 # print(v.query) 58 # # SELECT "app01_userinfo"."id", "app01_userinfo"."username", "app01_userinfo"."password", "app01_userinfo"."age", "app01_userinfo"."ut_id" FROM "app01_userinfo" , "app01_usertype" WHERE (app01_usertype.id = app01_userinfo.ut_id) 59 # 60 # # 执行原生SQL 61 # from django.db import connection, connections 62 # cursor = connection.cursor() # cursor = connections['default'].cursor() 看配置文件数据库默认字段default如果有多个库,填库名称即可 63 # cursor.execute("""SELECT * from app01_userinfo where id = %s""", [1]) 64 # row = cursor.fetchone() 65 # row = cursor.fetchall() 66 # 67 # # def raw(self, raw_query, params=None, translations=None, using=None): 68 # # models.UserInfo.objects.raw('select * from userinfo') 69 # # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名 70 # # models.UserInfo.objects.raw('select id as nid from 其他表') 71 # # 为原生SQL设置参数 72 # # models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12, ]) 73 # # 将获取的到列名转换为指定列名 74 # # name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'} 75 # # models.UserInfo.objects.raw('SELECT * FROM some_other_table', translations=name_map) 76 # # 指定数据库 77 # models.UserInfo.objects.raw('select * from userinfo', using="default") 78 # 79 # # 综合运用 80 # result = models.UserInfo.objects.filter(id__gt=1).extra( 81 # where=['app01_userinfo.id<%s'], 82 # params=[100, ], 83 # tables=['app01_usertype'], 84 # order_by=['-app01_userinfo.id'], 85 # select={'uid': 1, 'uuid': "select count(1) from app01_userinfo where app01_userinfo.age<%s"}, 86 # select_params=[20, ] 87 # ) 88 # # SELECT (1) AS "uid", (select count(1) from app01_userinfo where app01_userinfo.age<20) AS "uuid", "app01_userinfo"."id", "app01_userinfo"."username", "app01_userinfo"."password", "app01_userinfo"."age", "app01_userinfo"."ut_id" \ 89 # # FROM "app01_userinfo" , "app01_usertype" WHERE ("app01_userinfo"."id" > 1 AND (app01_userinfo.id<100)) ORDER BY ("app01_userinfo".id) DESC 90 # print(result.query)
1 # 排序order_by 2 # user_list = models.UserInfo.objects.all().order_by('-id', 'username') # 倒序 从大到小 3 # print(user_list) 4 from django.db.models import Count, Sum, Max, Min, Avg 5 # 分组annotate(根据某一个字段进行分组),(aggregate它是整张表聚合弄成一个组) 6 # v = models.UserInfo.objects.values('ut_id').annotate(xxx=Count('id')) 7 # print(v.query) # SELECT "app01_userinfo"."ut_id", COUNT("app01_userinfo"."id") AS "xxx" FROM \ 8 # "app01_userinfo" GROUP BY "app01_userinfo"."ut_id" 9 # result = models.UserInfo.objects.aggregate(k=Count('ut_id', distinct=True), n=Count('id')) 10 # print(result) # {'k': 3, 'n': 4} 11 12 13 # 相当于having函数 14 # filter在前在后不一样,在前面相当于表示where条件,后边再分组,最后在having就相当于mysql里边where>group_by>having 15 # v = models.UserInfo.objects.values('ut_id').annotate(xxx=Count('id')).filter(xxx__gt=1) 16 # SELECT "app01_userinfo"."ut_id", COUNT("app01_userinfo"."id") AS "xxx" FROM "app01_userinfo" \ 17 # GROUP BY "app01_userinfo"."ut_id" HAVING COUNT("app01_userinfo"."id") > 1 18 # print(v.query) 19 # 去重注意了distinct 20 # 在django里边数据源的不同,有不同的搞法 连mysql sqlite distinct()里边不能传参数 21 # models.UserInfo.objects.values('id').distinct() 22 # select distinct id from userinfo 23 24 # 而在PostgreSQL参数直接传进去 25 # models.UserInfo.objects.distinct('id') 26 # select distinct id from userinfo 27 28 # 反转操作必须跟排序同时用才起作用reverse 把id升序 username倒序 29 # models.UserInfo.objects.all().order_by('-id', 'username').reverse() 30 31 # only注意 defer 32 # v = models.UserInfo.objects.all().only('id', 'username') 33 # v = models.UserInfo.objects.all().defer('username') # 排除 34 # for obj in v: 35 # print(obj.id, obj.username, obj.age) # 注意如果再拿obj.age又要发sql请求这样会降低效率 36 37 # using指定在哪个数据库取数据 38 # models.UserInfo.objects.all().using('db2') 前提有这张表这个数据库 不写参数默认'default'在settings里边配多个库可以 39 40 # get方法少用 取不到直接报错,取多个也报错 41 42 # create 43 # models.UserType.objects.create(title='xxx') 44 # models.UserType.objects.create(**{"title": 'xxx'}) 45 # obj = models.UserType(title='xxx') # 临时的未提交数据库 46 # obj.save() # 提交 47 48 # bulk_create批量增加 49 # def bulk_create(self, objs, batch_size=None): 50 # batch_size表示一次插入的个数 不要大量的批量加 最多999个 51 # objs = [ 52 # models.UserInfo(name='r11'), 53 # models.UserInfo(name='r22') 54 # ] 55 # models.UserInfo.objects.bulk_create(objs, 10) 56 57 # def get_or_create(self, defaults=None, **kwargs): 58 # 如果存在,则获取,否则,创建 59 # defaults 指定创建时,其他字段的值 60 # update_or_create一样的操作 61 # obj, created = models.UserInfo.objects.get_or_create(username='root1',password='123456', 62 # defaults={'age': 18, 'ut_id': 2, 'password': '123456'}) 63 64 # in_bulk根据主键id进行查找 65 # id_list = [11, 21, 31] 66 # models.UserInfo.objects.in_bulk(id_list) 67 68 # exists是否存在
1 ################################################################## 2 # PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET # 3 ################################################################## 4 5 def all(self) 6 # 获取所有的数据对象 7 8 def filter(self, *args, **kwargs) 9 # 条件查询 10 # 条件可以是:参数,字典,Q 11 12 def exclude(self, *args, **kwargs) 13 # 条件查询 14 # 条件可以是:参数,字典,Q 15 16 def select_related(self, *fields) 17 性能相关:表之间进行join连表操作,一次性获取关联的数据。 18 model.tb.objects.all().select_related() 19 model.tb.objects.all().select_related('外键字段') 20 model.tb.objects.all().select_related('外键字段__外键字段') 21 22 def prefetch_related(self, *lookups) 23 性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。 24 # 获取所有用户表 25 # 获取用户类型表where id in (用户表中的查到的所有用户ID) 26 models.UserInfo.objects.prefetch_related('外键字段') 27 28 29 30 from django.db.models import Count, Case, When, IntegerField 31 Article.objects.annotate( 32 numviews=Count(Case( 33 When(readership__what_time__lt=treshold, then=1), 34 output_field=CharField(), 35 )) 36 ) 37 38 students = Student.objects.all().annotate(num_excused_absences=models.Sum( 39 models.Case( 40 models.When(absence__type='Excused', then=1), 41 default=0, 42 output_field=models.IntegerField() 43 ))) 44 45 def annotate(self, *args, **kwargs) 46 # 用于实现聚合group by查询 47 48 from django.db.models import Count, Avg, Max, Min, Sum 49 50 v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')) 51 # SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id 52 53 v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1) 54 # SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1 55 56 v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1) 57 # SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1 58 59 def distinct(self, *field_names) 60 # 用于distinct去重 61 models.UserInfo.objects.values('nid').distinct() 62 # select distinct nid from userinfo 63 64 注:只有在PostgreSQL中才能使用distinct进行去重 65 66 def order_by(self, *field_names) 67 # 用于排序 68 models.UserInfo.objects.all().order_by('-id','age') 69 70 def extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None) 71 # 构造额外的查询条件或者映射,如:子查询 72 73 Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,)) 74 Entry.objects.extra(where=['headline=%s'], params=['Lennon']) 75 Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"]) 76 Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid']) 77 78 def reverse(self): 79 # 倒序 80 models.UserInfo.objects.all().order_by('-nid').reverse() 81 # 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序 82 83 84 def defer(self, *fields): 85 models.UserInfo.objects.defer('username','id') 86 或 87 models.UserInfo.objects.filter(...).defer('username','id') 88 #映射中排除某列数据 89 90 def only(self, *fields): 91 #仅取某个表中的数据 92 models.UserInfo.objects.only('username','id') 93 或 94 models.UserInfo.objects.filter(...).only('username','id') 95 96 def using(self, alias): 97 指定使用的数据库,参数为别名(setting中的设置) 98 99 100 ################################################## 101 # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS # 102 ################################################## 103 104 def raw(self, raw_query, params=None, translations=None, using=None): 105 # 执行原生SQL 106 models.UserInfo.objects.raw('select * from userinfo') 107 108 # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名 109 models.UserInfo.objects.raw('select id as nid from 其他表') 110 111 # 为原生SQL设置参数 112 models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,]) 113 114 # 将获取的到列名转换为指定列名 115 name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'} 116 Person.objects.raw('SELECT * FROM some_other_table', translations=name_map) 117 118 # 指定数据库 119 models.UserInfo.objects.raw('select * from userinfo', using="default") 120 121 ################### 原生SQL ################### 122 from django.db import connection, connections 123 cursor = connection.cursor() # cursor = connections['default'].cursor() 124 cursor.execute("""SELECT * from auth_user where id = %s""", [1]) 125 row = cursor.fetchone() # fetchall()/fetchmany(..) 126 127 128 def values(self, *fields): 129 # 获取每行数据为字典格式 130 131 def values_list(self, *fields, **kwargs): 132 # 获取每行数据为元祖 133 134 def dates(self, field_name, kind, order='ASC'): 135 # 根据时间进行某一部分进行去重查找并截取指定内容 136 # kind只能是:"year"(年), "month"(年-月), "day"(年-月-日) 137 # order只能是:"ASC" "DESC" 138 # 并获取转换后的时间 139 - year : 年-01-01 140 - month: 年-月-01 141 - day : 年-月-日 142 143 models.DatePlus.objects.dates('ctime','day','DESC') 144 145 def datetimes(self, field_name, kind, order='ASC', tzinfo=None): 146 # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间 147 # kind只能是 "year", "month", "day", "hour", "minute", "second" 148 # order只能是:"ASC" "DESC" 149 # tzinfo时区对象 150 models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.UTC) 151 models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai')) 152 153 """ 154 pip3 install pytz 155 import pytz 156 pytz.all_timezones 157 pytz.timezone(‘Asia/Shanghai’) 158 """ 159 160 def none(self): 161 # 空QuerySet对象 162 163 164 #################################### 165 # METHODS THAT DO DATABASE QUERIES # 166 #################################### 167 168 def aggregate(self, *args, **kwargs): 169 # 聚合函数,获取字典类型聚合结果 170 from django.db.models import Count, Avg, Max, Min, Sum 171 result = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid')) 172 ===> {'k': 3, 'n': 4} 173 174 def count(self): 175 # 获取个数 176 177 def get(self, *args, **kwargs): 178 # 获取单个对象 179 180 def create(self, **kwargs): 181 # 创建对象 182 183 def bulk_create(self, objs, batch_size=None): 184 # 批量插入 185 # batch_size表示一次插入的个数 186 objs = [ 187 models.DDD(name='r11'), 188 models.DDD(name='r22') 189 ] 190 models.DDD.objects.bulk_create(objs, 10) 191 192 def get_or_create(self, defaults=None, **kwargs): 193 # 如果存在,则获取,否则,创建 194 # defaults 指定创建时,其他字段的值 195 obj, created = models.UserInfo.objects.get_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 2}) 196 197 def update_or_create(self, defaults=None, **kwargs): 198 # 如果存在,则更新,否则,创建 199 # defaults 指定创建时或更新时的其他字段 200 obj, created = models.UserInfo.objects.update_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 1}) 201 202 def first(self): 203 # 获取第一个 204 205 def last(self): 206 # 获取最后一个 207 208 def in_bulk(self, id_list=None): 209 # 根据主键ID进行查找 210 id_list = [11,21,31] 211 models.DDD.objects.in_bulk(id_list) 212 213 def delete(self): 214 # 删除 215 216 def update(self, **kwargs): 217 # 更新 218 219 def exists(self): 220 # 是否有结果
1 # select_related:主动做连表 参数可以为多个外键字段名字 第一次连表直接数据拿出来减少发sql语句请求 2 q = models.UserInfo.objects.all().select_related('ut') 3 for row in q: 4 print(row.username, row.ut.title) 5 # 外键好处:1.约束2.硬盘占用空间小 但是查询速度要慢点 但是数据量特别大一般不做外键操作 6 7 # prefetch_related:不做连表,增加查询次数 8 # 两次查询都是单表查询 9 # 第一次查:select * from userinfo 10 # 假如公司用户有100个,供选择的用户类型有10种,本公司只有2种用户 11 # 第二次查:django内部:先拿到用户表中ut_id字段进行去重处理ut_id=[2,4] 12 # select * from usertype where id in [2,4] 13 q = models.UserInfo.objects.all().prefetch_related('ut') 14 for row in q: 15 print(row.id, row.ut.title)
在基本操作中filter(age__isnull=True)
如果用户提交过来的字段比较多
增加:
dic = {'name':'xxx','age':18.......}
create(**dic)
更新:
filter(id=1).update(**dic)
查询: 一大堆条件
filter(**{'id':1, 'name':'sb'})