select_related(self, *fields)
def select_related(self, *fields)
性能相关:表之间进行join连表操作,一次性获取关联的数据。
model.tb.objects.all().select_related()
model.tb.objects.all().select_related('外键字段')
model.tb.objects.all().select_related('外键字段__外键字段')
"""
从sql语言中来分析select_related():
model.tb.objects.all()的sql语言就是 select * from tb
model.tb.objects.all().select_related('外键字段')的事情了语言是select * from tb left join 外键表 on tb.外键字段_id = 外键表.id
该方法能够减少获取外键连表的请求数据库次数,能够提高程序的执行效率。
"""
order_by() 和 reverse()方法
def order_by(self, *field_names)
models.UserInfo.objects.all().order_by('-id','age')
def reverse(self):
models.UserInfo.objects.all().order_by('-nid').reverse()
defer() 和 only()方法
def only(self, *fields):
models.UserInfo.objects.only('username','id')
或
models.UserInfo.objects.filter(...).only('username','id')
def defer(self, *fields):
models.UserInfo.objects.defer('username','id')
或
models.UserInfo.objects.filter(...).defer('username','id')
def values(self, *fields):
models.UserInfo.objects.all().values('username','id')
def values_list(self, *fields, **kwargs):
models.UserInfo.objects.all().values_list('username','id')
"""
only拿到的数据是一个对象,并且是只包含“id,和user”的对象:[obj(id),obj(user)]
defer拿到的数据也是一个对象,映射中排除了指定的某列数据
需要注意的是,未拿到的数据也可以通过 obj.字段 的方式获取值,不过该方式会重新再发一次请求,影响效率
value拿到的是一个字典,
value_list拿到的是一个元组
"""
using()方法
def using(self, alias):
models.Person.objects.all().using(alias="default")