对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related()来对QuerySet进行优化. 在对QuerySet使用select_related()函数后,Django会获取相应外键对应的对象,从而在之后需要的时候不必再查询数据库了。 But我实际应用时: 并没有发现什么好处 不用select_related()情况的一个例子: obj1 = models....
pizzas = Pizza.objects.prefetch_related('toppings') [list(pizza.toppings.filter(spicy=True))forpizzainpizzas] 因为第二步操作里,会对 toppings 数据进行一次新的 filter 过滤操作,所以会导致每次该语句重新去查询数据库,也就是说,我们的 prefetch_related() 操作是失效的。 以上就是本篇笔记全部内容,接下...
select_related将会根据外键关系(注意: 仅限单对单和单对多关系),在执行查询语句的时候通过创建一条包含SQL inner join操作的SELECT语句来一次性获得主对象及相关对象的信息。现在我们对article_list视图函数稍微进行修改,加入select_related方法,在查询文章列表时同时一次性获取相关联的category对象信息,这样在模板中调用 ...
select_related prefetch_related 在介绍 select_related 和 prefetch_related 这两个函数前,我们先来看一个例子。 对于,Entry 和 Blog 这两个 model,前面介绍过,Blog 是 Entry 的外键,如下: class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField()class Entry(mo...
原文链接:Django笔记十一之外键查询优化select_related和prefetch_related 本篇笔记目录如下: select_related prefetch_related 在介绍 select_related 和 prefetch_related 这两个函数前,我们先来看一个例子。 对于,Entry 和 Blog 这两个 model,前面介绍过,Blog 是 Entry 的外键,如下: class Blog(models.Model): na...
2prefetch_related 在介绍 select_related 和 prefetch_related 这两个函数前,我们先来看一个例子。 对于,Entry 和 Blog 这两个 model,前面介绍过,Blog 是 Entry 的外键,如下: Plain Text 复制代码 99 1 2 3 4 5 6 7 8 9 10 11 12
pizzas=Pizza.objects.prefetch_related('toppings')[list(pizza.toppings.filter(spicy=True))forpizzainpizzas] 因为第二步操作里,会对 toppings 数据进行一次新的 filter 过滤操作,所以会导致每次该语句重新去查询数据库,也就是说,我们的 prefetch_related() 操作是失效的。
一、select_related查询优化 select_related通过多表join关联查询,一次性获得所有数据,通过降低数据库查询次数来提升性能,但关联表不能太多,因为join操作本来就比较消耗性能。本文通过Django debug toolbar工具来直观显示查询次数、查询语句,如果不会使用“Django debug toolbar”工具,可以翻看我之前写的博客,从而配置它!
当值为 True 时,select_related() 总是会被调用。当值设置为 False 时,Django 将查看 list_display,如果有 ForeignKey,则调用 select_related()。 如果你需要更精细的控制,可以使用元组(或列表)作为 list_select_related 的值。空元组将阻止 Django 调用 select_related。任何其他元组将直接传递给 select_related...
select_related() 接受depth参数,depth参数可以确定select_related的深度。Django会递归遍历指定深度内的所有的OneToOneField和ForeignKey 3 :不指定参数 select_related() 也可以不加参数,这样表示要求Django尽可能深的select_related Django本身内置一个上限,对于特别复杂的表关系,Django可能在你不知道的某处跳出递归,从而与...