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