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

问题描述 投票:0回答:3

我的一个 django 模型有一个很大的

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

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

python django django-models
3个回答
20
投票

当您使用

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

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

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


9
投票

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


7
投票

对于这样的事情,你可以覆盖默认管理器。通常,不建议这样做,但对于 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()
© www.soinside.com 2019 - 2024. All rights reserved.