Может ли django lazy-load поля в модели?
Одна из моих моделей django имеет большой TextField
, который мне часто не нужно использовать. Есть ли способ рассказать django о "ленивой загрузке" этого поля? то есть не пытаться вытащить его из базы данных, если я явно не попрошу об этом. Я трачу много памяти и полосы пропускания, вытягивая этот TextField
в python каждый раз, когда я обращаюсь к этим объектам.
Альтернативой было бы создать новую таблицу для содержимого этого поля, но я бы предпочел избежать этой сложности, если смогу.
Ответы
Ответ 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
, так как код не только легче понять, но и более удобен в обслуживании в конечном итоге.