# 需求: 只取某n列 queryset=[ {},{}] models.User.objects.all().values( 'id','name') queryset=[ (),()] models.User.objects.all().values_list( 'id','name') queryset=[ obj,obj] result = models.User.objects.all().only('id','name','age') # result = models.User.objects.all().defer('id','name','age') for item in reuslt: print(item.id,item.name,item.age)
# 需求: 打印全部用户姓名以及部门名称 class depart: title = .... class User: name = ... dp = FK(depart) # select * from user # result = models.User.objects.all() # for item in result: # 性能低,会跨表 至关于你查10我的就跨表查了10次+原本1次 # 可是若是连表太多。那性能也会变差,由于表太多了 # print(item.name,item.dp.title)
# select * from user left join depart on user.dp_id = depart.id # result = models.User.objects.all().selected_related('dp') # 主动建立了关联关系。一次查表就能够拿出来 # for item in result: # 就不会在发请求查询了,性能更好了 # print(item.name,item.dp.title )
# select * from user # 经过python 代码获取 dp_id= [1,2] # select * from depart where id in dp_id result = models.User.objects.all().prefetch_related('dp') for item in result: # 至关于查了两次。可是不会由于连表太多影响性能了 print(item.name,item.dp.title )
# - extra Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,)) Entry.objects.extra(where=['headline=%s'], params=['Lennon']) Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"]) Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid']) """----------------------------------- """ # - raw # 执行原生SQL models.UserInfo.objects.raw('select * from userinfo') # 若是SQL是其余表时,必须将名字设置为当前UserInfo对象的主键列名 models.UserInfo.objects.raw('select id as nid from 其余表') # 为原生SQL设置参数 models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,]) # 指定捆绑条件后跨表查询 name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'} Person.objects.raw('SELECT * FROM some_other_table', translations=name_map) """----------------------------------- """ # - 彻底执行原生SQL from django.db import connection, connections cursor = connection.cursor() # cursor = connections['default'].cursor() cursor.execute("""SELECT * from auth_user where id = %s""", [1]) row = cursor.fetchone() # fetchall()/fetchmany(..) # PS: 选择数据库 using('default') 默认是 default queryset = models.Course.objects.using('default').all()
model_name = obj.queryset.model._meta.model_name
app_label = obj.queryset.model._meta.app_label
title_obj = field_obj._meta.get_field("title") title_max_length = title.max_length # 32 # 能够拿出来字段的属性对应的值 title.rel.to.objects.all() # 根据字段对象可取出来映射关联表的全部内容
循环每一个字段,生成字典 字段为键,查询的为值,(字典一个键只能有一个值) 所以会有重复数据
用 .distinctu() 去重python