q = models.UserInfo.objects.all().filter(id__lt=60)
# for row in q:
# print(row.id,row.name,row.ut.title)
# 这样进行查询性能不好,需要重新发sql请求在进行查询另外一张表中的数据,如果有10条数据就要进行11次查询
q = models.UserInfo.objects.all().values('name','id','ut__title').filter(id__lt=60)
# for i in q:
# print(i['name'],i['ut__title'])
# 这样 进行了 优化 不回重复发送sql请求,到的结果内是字典
q = models.UserInfo.objects.all().select_related('ut').filter(id__lt=60)
print(q.query)
# for row in q:
# print(row.id,row.name,row.ut.title)
# select_related('ut') 相当 于 inner join 先连成一张表再进行查询
prefetch_related() 不做连表,做多次查询
q = models.UserInfo.objects.all().prefetch_related('ut').filter(id__lt=60)
for row in q:
print(row.id,row.name,row.ut.title)
# 如果查询的数据比较多,查询的次数比较多就不建议用select_related进行连表查询,毕竟连表查询毕竟有损耗。
# distinct()
v = models.UserInfo.objects.values('age').distinct()
for item in v:
print(item)
# 在mysql,sqlite中distinct()括号里是不能传参数,
# selectdistinct nid from userinfo;
# 而在 PostgreSQL 中
# models.UserInfo.objects.distinct('nid')
# reverse()
v = models.UserInfo.objects.all().order_by('id').reverse()
# reverse() 必须在order_by()后使用不能单独使用。
for i in v:
print(i.id)
v = models.UserInfo.objects.all().order_by('-id','name').reverse()
# 相当于order_by('id','-name')
# only()
v = models.UserInfo.objects.all()
# [obj]
v = models.UserInfo.objects.all().only('id','name')
# [obj]for obj in v:
print(obj.name,obj.id,obj.age)
# 虽然加里only(),但是还能取出其他数据,但是不要这么取,会在再区表中进行查询影响效率,写几个取几个,不要多取
v = models.UserInfo.objects.values('id','name').all()
# [{id,name}]for i in v:
print(i)
# 如果需要的sql语句Django这个没有提供,可以用下面3中方法解决# extra# 原生sql# raw# raw
res = models.UserInfo.objects.raw('select id,name,age from app01_userinfo whereid < 10')
foritemin res:
print(item.age,item.name)
# 为原生SQL设置参数
models.UserInfo.objects.raw('select idas nid from userinfo where nid>%s', params=[12,])
# 将获取的到列名转换为指定列名
name_map = {'age': 'new_age', 'name': 'new_name'}
r = models.UserInfo.objects.raw('SELECT * FROM app01_userinfo', translations=name_map)
for i in r:
print(i.new_age)
# 指定数据库# models.UserInfo.objects.raw('select * from userinfo', using="default")