【问题标题】:How to have a backend_model be associated to a Django model如何将 backend_model 关联到 Django 模型
【发布时间】:2021-10-22 04:45:07
【问题描述】:

我有一个 Ticker 模型 -

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

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

【问题讨论】:

  • LstmModel(symbol) 中的symbol 是什么?从 Model 实例的角度来看是 self.ticker.symbol 吗?
  • @ViggieSmalls 是的!

标签: python django django-models django-queryset


【解决方案1】:

我还没有测试过这个,所以它可能会在这里和那里失败。请记住,这应该 (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 负载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-10
    • 2012-12-24
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    相关资源
    最近更新 更多