在首次访问时计算Django模型字段值(惰性字段)

时间:2018-09-03 10:20:55

标签: python django django-models

说明:

我想向现有的Django模型添加新字段。
可以使用外部API计算每个实例的该字段的值。

由于数据库中已经保存了大量实例,并且外部API具有配额,因此在数据库迁移时为每个实例计算该字段不是一个好主意。

值得一提的是,此字段很少被访问。

问题:

是否可以仅在首次访问该特定字段时才计算该值并将其保存在数据库中以备将来使用?
是否有处理这种情况的标准方法?

1 个答案:

答案 0 :(得分:0)

通常的答案是“将字段包装在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

但是我绝对不会在我的团队中允许此操作-我不希望getter发出HTTP请求并更新数据库-我强烈建议您找到一种更好的(健壮,可靠和可预测的)方法来解决< em> real 问题,主要是处理API配额。