【问题标题】:Can django lazy-load fields in a model?django 可以延迟加载模型中的字段吗?
【发布时间】:2010-06-16 23:31:20
【问题描述】:

我的一个 django 模型有一个很大的 TextField,我经常不需要使用它。有没有办法告诉 django “延迟加载”这个字段?即除非我明确要求,否则不要费心从数据库中提取它。每次引用这些对象时,我都会浪费大量内存和带宽将 TextField 拉入 python。

替代方法是为此字段的内容创建一个新表,但如果可以的话,我宁愿避免这种复杂性。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

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

    现在,实际上,重构并将数据拉入另一个表的替代解决方案是一个非常好的解决方案。有人会说,需要延迟加载字段意味着存在设计缺陷,数据应该采用不同的建模方式。

    不过,无论哪种方式都有效!

    【讨论】:

      【解决方案2】:

      在 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")

        我个人认为onlydefer 更好,因为代码不仅更容易理解,而且从长远来看也更易于维护。

      【讨论】:

        【解决方案3】:

        对于这样的事情,您可以覆盖默认管理器。通常,不建议这样做,但对于 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()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-12
          • 1970-01-01
          • 2018-04-02
          • 2011-08-25
          • 2013-06-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多