如何将 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
一次?
这些是我想到的解决方案-
- 有自定义模型管理器。
- 覆盖模型的
save()
方法。
- 添加一个
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
负载。
我有一个代码模型 -
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
一次?
这些是我想到的解决方案-
- 有自定义模型管理器。
- 覆盖模型的
save()
方法。 - 添加一个
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
负载。