关键词

详解Django的 defer() 函数:排除指定的字段

Django中defer()函数的作用与使用方法

defer()是Django ORM(对象关系映射)提供的函数之一,用于指定查询需要排除掉的字段(即只查询需要的字段,不查询被排除的字段),可以用来针对一些数据库表设计的很差的应用程序进行优化。使用defer()可以减少数据库读取次数,从而提高Django应用程序的性能。

defer() 函数的使用方法

defer()函数有两种用法:

1. 延迟加载指定字段

在查询时使用defer()函数指定不需要加载的字段名,如下所示:

from myapp.models import MyModel

# 定义查询需要的字段,并指定排除'id'字段
qs = MyModel.objects.defer('id')

# 针对查询结果中的个别对象重新早期加载某些字段
qs.defer('some_field') 

2. 加载指定的字段

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

展开阅读全文