Вычислить значение поля модели Django при первом доступе (Lazy Field) - PullRequest
0 голосов
/ 03 сентября 2018

Описание:

Я хочу добавить новое поле в существующую модель Django.
Значение этого поля для каждого экземпляра может быть вычислено с использованием внешнего API.

Поскольку в базе данных уже сохранено большое количество экземпляров, а внешний API имеет квоту, не рекомендуется вычислять это поле для каждого экземпляра при переносе базы данных.

Стоит отметить, что к этому полю редко обращаются.

Вопрос:

Можно ли вычислить значение только при первом доступе к этому конкретному полю и сохранить его в базе данных для будущего использования?
Есть ли стандартный способ справиться с этой ситуацией?

1 Ответ

0 голосов
/ 03 сентября 2018

Общий ответ «обернуть поле в property (или другой дескриптор), то есть:

class MyModel(models.Model):
    _lazy = models.WhateverField(
      db_column="lazy",
      blank=True, 
      null=True,  
      default=None
      )

    @property
    def lazy(self):
        if self._lazy is None:
            self._lazy = get_the_value_from_api_call(...) 
            self.save(update_fields=["_lazy"])
        return self._lazy

    # if you want to be able to set the property - else
    # ignore this part and `MyModel.lazy` will become
    # read-only 
    @lazy.setter
    def lazy(self, value):
        self._lazy = value

НО я бы определенно НЕ позволил это сделать в моей команде - я не ожидаю, что получатель выполнит HTTP-запрос и обновит базу данных - и я настоятельно рекомендую вам найти лучший (надежный, надежный и предсказуемый) способ решения реальная проблема, связанная, в основном, с обработкой квоты API.

...