Подтвердить что ты не робот

Может ли django lazy-load поля в модели?

Одна из моих моделей django имеет большой TextField, который мне часто не нужно использовать. Есть ли способ рассказать django о "ленивой загрузке" этого поля? то есть не пытаться вытащить его из базы данных, если я явно не попрошу об этом. Я трачу много памяти и полосы пропускания, вытягивая этот TextField в python каждый раз, когда я обращаюсь к этим объектам.

Альтернативой было бы создать новую таблицу для содержимого этого поля, но я бы предпочел избежать этой сложности, если смогу.

4b9b3361

Ответ 1

Функциональность возникает, когда вы делаете запрос, используя оператор defer(), а не в определении модели. Проверьте это в документах: http://docs.djangoproject.com/en/dev/ref/models/querysets/#defer

Теперь, фактически, ваше альтернативное решение по рефакторингу и вытягиванию данных в другую таблицу является действительно хорошим решением. Некоторые люди скажут, что необходимость ленивых полей загрузки означает, что существует дефект дизайна, и данные должны быть по-разному моделированы.

В любом случае это работает!

Ответ 2

Для чего-то вроде этого вы можете просто переопределить менеджер по умолчанию. Обычно это не рекомендуется, но для 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()

Ответ 3

В 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, так как код не только легче понять, но и более удобен в обслуживании в конечном итоге.