Как сделать так, чтобы модель backend_model была связана с моделью Django
У меня есть модель тикера -
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(symbol)
Как мне добавить это backend_model
к Model
?
Вот решения, о которых я подумал -
- Have a custom Model Manager.
- Override
save()
method of Model. - Add a
classmethod
to Model
Какой из них я должен использовать, или если кто-то может предложить лучший способ?
Я не тестировал это, так что это может не сработать здесь и там. Имейте в виду, что это должно (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)
Это загрузит реестр, затем построит модели lstm, получив все символы из модели Ticker
. Затем вы можете определить свою модель следующим образом:
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
нагрузки, когда вы обслуживаете запрос.