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

  • Post category:Python

Django的defer()函数是用于延迟加载表格某些字段的函数,可以大幅度提高Django的查询效率。

使用方法如下:

from django.db.models import F
objects = MyModel.objects.defer('field1', 'field2', ...)

其中,MyModel是要查询的模型,'field1', 'field2', ...'是要延迟加载的字段。

接下来提供两个实例说明:

实例一:

假设我们有一个名为Book的模型,其中包含很多字段,我们只需要查询其中的两个字段:nameauthor

class Book(models.Model):
    name = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=9, decimal_places=2)
    ...

我们可以使用defer()函数来延迟加载非必要的字段,提高查询效率:

books = Book.objects.defer('price', ...)

实例二:

假设我们有一个名为UserProfile的模型,其中包含很多字段,其中一个字段photo是一个图片类型的字段,可能会非常大。我们只需要查询其中的其他字段。

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    photo = models.ImageField(upload_to='avatars', blank=True)
    age = models.IntegerField()
    gender = models.CharField(choices=GENDER_CHOICES, max_length=10)
    ...

我们可以使用defer()函数来延迟加载非必要的photo字段,提高查询效率:

profiles = UserProfile.objects.defer('photo')