3月13日学习内容整理:ORM查询补充,ORM如何执行原生SQL语句
1、only方法
类名.objects.all().only("id","name")
all就相当于select *
加上only就代表不是查询全部字段了,返回的queryset中的对象只有id 和 name属性了
》》》》注意:这样查出来的对象我们只能去取only查出来的属性,如果再用对象.别的属性虽然不会出错会再次发起查询请求但是性能会变低,所以用only方法时我们就不要再去查询别的字段了
2、defer方法
类名.objects.all().defer("id","name")
与only相反,表示除了id和name其它都要查询
3、query方法
obj_list = 类名.objects.all()
obj_list.query 就会显示出查询的原生SQL语句
4、select_related()方法:用于主动做连表查询
类名.objects.all().select_related("dp") dp就是foreignkey外键字段名,可以写多个
返回queryset类名,里面仍是一个个对象
一次性拿到关联的字段值,比values方法做双下划线查询效率要高
5、prefetch_related()方法
类名.objects.all().prefetch_related("dp") dp就是foreignkey外键字段名
这个方法会做两次单表查询,第一次查询到的对象放到内存中,再利用对象的外键字段值也就是id值去被关联表做第二次单表查询,把查询到的关联对象放到内存中,我们获取的时候就直接从内存中匹配获取,这样比直接做连表查询要快
6、ORM中如何执行原生SQL语句
(1)
from django.db import connection, connections # 利用connection cursor = connection.cursor() # 利用connections,default是配置文件中数据库配置信息的key # cursor = connections['default'].cursor() cursor.execute("原生SQL语句") # 查询结果 row = cursor.fetchone()
(2)
# 利用extra 类名.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,)) 类名.objects.extra(where=['headline=%s'], params=['Lennon']) 类名.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"]) 类名.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
(3)这个不常用
# 利用raw models.UserInfo.objects.raw('select * from xxx') name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'} Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
price_policy_id