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
posted @ 2018-03-14 08:32  九二零  阅读(136)  评论(0编辑  收藏  举报