如何将 backend_model 关联到 Django 模型

How to have a backend_model be associated to a Django model

我有一个代码模型 -

class Ticker(models.Model):
    symbol = models.CharField(max_length=50, primary_key=True)
    company_name = models.CharField(max_length=50)

    def __str__(self) -> str:
        return f'{self.symbol}-{self.company_name}'

class Model(models.Model):
    ticker = models.ForeignKey(Ticker, on_delete=models.CASCADE)
    test_loss = models.FloatField(null=True)

    def __str__(self) -> str:
        return f'{self.ticker.symbol}'

我想将此功能添加到模型中 -

def predict(self, pred_date):
    return self.backend_model.predict(pred_date)

哪里-

self.backend_model = LstmModel(self.ticker.symbol)

如何在实例化期间仅将此 backend_model 添加到 Model 一次?

这些是我想到的解决方案-

  1. 有自定义模型管理器。
  2. 覆盖模型的 save() 方法。
  3. 添加一个classmethod到模型

我应该使用哪个,或者是否有人可以提出更好的方法?

我还没有测试过这个,所以它可能会时不时地失败。请记住,这应该 (1) 导致您的服务器启动需要一段时间 (2) 您将不得不重新启动服务器以更新注册表,以及其他问题。使用它需要您自担风险 ;)

您可以像这样在项目中的某处定义注册表:

class LstmModelRegistry:
    def __init__(self):
        self._registry = {} 

    def register(self, symbol):
        self._registry[symbol] = LstmModel(symbol)

    def get_service_by_symbol(self, symbol):
        service = self._registry.get(symbol)
        if not service:
            raise Exception('Unknown service')
        return service


lstm_registry = LstmModelRegistry()

然后在您的应用配置之一中,您可以执行如下操作:

class SomeAppConfig(AppConfig):
    def ready(self):
        from path.to.lstm.registry import lstm_registry
        from path.to.ticker.model import Ticker

        symbols = list(Ticker.objects.values_list('symbol', flat=True))
        for symbol in symbols:
            lstm_registry.register(symbol)

这将加载注册表,然后通过从 Ticker 模型获取所有符号来构建 lstm 模型。然后你可以像这样定义你的模型:

from path.to.lstm.registry import lstm_registry


class Model(models.Model):
    ...
    def predict(self, pred_date):
        return lstm_registry.get_service_by_symbol(self.ticker.symbol).predict(pred_date)

反过来,这应该只是 运行 predict,而不会在您处理请求时产生昂贵的 LstmModel 负载。