django可以在模型中延迟加载字段吗?

Leo*_*opd 15 python django django-models

我的一个django型号有一个TextField我经常不需要使用的大型.有没有办法告诉django这个领域"懒惰"?即除非我明确要求,否则不要费心从数据库中提取它.TextField每次我引用这些对象时,我都会浪费大量内存和带宽将其拉入python.

另一种方法是为该字段的内容创建一个新表,但如果可以,我宁愿避免这种复杂性.

Ala*_*mas 14

使用defer()语句而不是在模型定义中进行查询时,会发生此功能.请在文档中查看:http: //docs.djangoproject.com/en/dev/ref/models/querysets/#defer

现在,实际上,您重构和将数据拉入另一个表的替代解决方案是一个非常好的解决方案.有些人会说,需要延迟加载领域意味着存在一个设计缺陷,数据应该是参照不同.

无论哪种方式都有效!


Min*_*gyu 6

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因为代码更容易理解,而且从长远来看也更易于维护.


小智 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()
Run Code Online (Sandbox Code Playgroud)