我的一个 django 模型有一个很大的
TextField
,我经常不需要使用它。有没有办法告诉 django “延迟加载”这个字段?也就是说,除非我明确要求,否则不要费心从数据库中提取它。每次我引用这些对象时,我都会浪费大量内存和带宽将这个TextField
拉入Python。
另一种方法是为此字段的内容创建一个新表,但如果可以的话,我宁愿避免这种复杂性。
当您使用
defer()
语句而不是在模型定义中进行查询时,该功能就会发生。在文档中查看:
http://docs.djangoproject.com/en/dev/ref/models/querysets/#defer
现在,实际上,重构并将数据拉入另一个表的替代解决方案是一个非常好的解决方案。有些人会说,需要延迟加载字段意味着存在设计缺陷,数据应该以不同的方式建模。
不过,无论哪种方式都有效!
Django 中有两种延迟加载选项: https://docs.djangoproject.com/en/5.0/ref/models/querysets/#django.db.models.query.QuerySet.only
延迟(*字段)
避免加载那些需要昂贵处理才能将其转换为 Python 对象的字段。
Entry.objects.defer("text")
仅(*字段)
仅加载您实际需要的字段
Person.objects.only("name")
我个人认为
only
比defer
更好,因为代码不仅更容易理解,而且从长远来看也更易于维护。
对于这样的事情,你可以覆盖默认管理器。通常,不建议这样做,但对于 defer() 来说这是有意义的:
class CustomManager(models.Manager):
def get_queryset(self):
return super(CustomManager, self).get_queryset().defer('YOUR_TEXTFIELD_FIELDNAME')
class DjangoModel(models.Model):
objects = CustomerManager()