defer()
是Django ORM(对象关系映射)提供的函数之一,用于指定查询需要排除掉的字段(即只查询需要的字段,不查询被排除的字段),可以用来针对一些数据库表设计的很差的应用程序进行优化。使用defer()
可以减少数据库读取次数,从而提高Django应用程序的性能。
defer()
函数的使用方法defer()
函数有两种用法:
在查询时使用defer()
函数指定不需要加载的字段名,如下所示:
from myapp.models import MyModel
# 定义查询需要的字段,并指定排除'id'字段
qs = MyModel.objects.defer('id')
# 针对查询结果中的个别对象重新早期加载某些字段
qs.defer('some_field')
defer()
函数可以与only()
一起使用,限制只加载指定的字段。如下示例,只查询'title'和'content'字段:
from myapp.models import MyModel
# 排除'description'字段,只查询'title'和'content'字段
qs = MyModel.objects.defer('description').only('title', 'content')
defer()
函数使用示例下面提供两个实例来展示defer()
函数的使用方法。
考虑一个Django博客应用程序,其中每个博客文章都有大量的富文本内容(例如:大量图像或视频引用)。如果通过ORM加载文章列表时查询所有内容的话,每次加载都需要大量的时间和服务器资源。
在这种情况下,可以将content
字段设置为延迟加载,以避免在加载文章列表时获取大量内容:
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
查询数据库时,使用defer()
将content
字段设置为延迟加载:
from myapp.models import Blog
# 我们只需查询出标题,以及发布和修改日期
blogs = Blog.objects.defer('content').only('title', 'pub_date', 'modified_date')
现在,只有在需要使用文章的内容时,才会从数据库中加载它。
考虑一个Django在线商店,有一个Product
模型,其中包含大量属性(如颜色、尺寸、重量、价格等)。
在管理员列表中,我们不需要加载任何产品的属性,只需展示唯一的标识符和商品名称。因此,我们可以使用defer()
来避免加载不必要的属性:
from django.db import models
class Product(models.Model):
sku = models.CharField(max_length=100)
name = models.CharField(max_length=255)
color = models.CharField(max_length=20)
size = models.CharField(max_length=20)
weight = models.DecimalField(max_digits=7, decimal_places=2)
price = models.DecimalField(max_digits=7, decimal_places=2)
在列出产品列表时使用defer()
将大量属性设置为延迟加载:
from myapp.models import Product
# 我们仅需要名称和SKU号
product_list = Product.objects.defer('name', 'color', 'size', 'weight', 'price').only('sku')
现在,在加载产品列表时,只有在需要使用产品的某些属性时才会从数据库中加载它们。
综上所述,defer()
函数是一个非常重要的函数,它可以根据需要选择性地加载数据,从而提高Django应用程序的性能。
本文链接:http://task.lmcjl.com/news/16254.html