Как сделать так, чтобы модель 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?

Вот решения, о которых я подумал -

  1. Have a custom Model Manager.
  2. Override save() method of Model.
  3. 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 нагрузки, когда вы обслуживаете запрос.

Вернуться на верх