Может ли Django лениво загружать поля в модели? - PullRequest
14 голосов
/ 17 июня 2010

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

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

Ответы [ 3 ]

13 голосов
/ 17 июня 2010

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

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

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

5 голосов
/ 15 сентября 2013

В Django есть два варианта отложенной загрузки: https://docs.djangoproject.com/en/1.6/ref/models/querysets/#django.db.models.query.QuerySet.only

  • defer (* fields)

    Избегайте загрузки тех полей, которые требуют дорогой обработки для преобразованияих в объекты Python.

    Entry.objects.defer("text")

  • только (* поля)

    Загружать только те поля, которые вам действительно нужны

    Person.objects.only("name")

    Лично я думаю, что only лучше, чем defer, поскольку код не только легче понять, но и удобнее поддерживать в долгосрочной перспективе.

5 голосов
/ 09 мая 2013

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