maxclax
@maxclax

Как реализовать логику с модели Django?

Имею модель:
def rate(self):
     return self.course - self.course / 100 * self.deviation

currency_from = models.ForeignKey(Currency, verbose_name=_('_from'), related_name="currency_from")
currency_to = models.ForeignKey(Currency, verbose_name=_('_to'), related_name="currency_to")
course = models.DecimalField(verbose_name=_('course'), max_digits=20, decimal_places=10)
deviation = models.DecimalField(verbose_name=_('deviation'), default=0, max_digits=20, decimal_places=10)


Далее используя эту модель, где необходимо я вызываю метод rate(). Так вот меня смущает то, что некая логика (подсчет) лежит у меня в моделе. Модель по сути не должна в себе содержать никакой логики. Подскажите, как или куда вы выносите логику модели, которая делает некие изминения над атрибутами модели при выводе? Возможно для этого необходимо реалезовать свой manager.py
  • Вопрос задан
  • 2619 просмотров
Пригласить эксперта
Ответы на вопрос 3
@FireGM
Модель по сути не должна в себе содержать никакой логики

Почему? Если работает с одним экземпляром модели, то именно в ней и надо делать метод.
А менеджеры нужны для другого. Там больше работа с QuerySet'ами.
Ответ написан
Комментировать
crazyzubr
@crazyzubr
Python backend-developer
меня смущает то, что некая логика (подсчет) лежит у меня в моделе

это с какого языка/фреймворка вы перешли на джанго? не должно это смущать совсем.
Могу только посоветовать использовать декоратор @property или @cached_property. Тогда не нужно будет свойство вызывать как метод. Пример:
from django.utils.functional import cached_property

@cached_property
def rate(self):
     return self.course - self.course / 100 * self.deviation

# Получаем так
rate = obj.rate


P.S.
это с какого языка/фреймворка вы перешли на джанго?

вопрос снимается, вспомнил: PHP и Symphony 2 =)
Ответ написан
Комментировать
Tiendil
@Tiendil
Разработчик ПО.
>Подскажите, как или куда вы выносите логику модели, которая делает некие изминения над атрибутами модели при выводе?

1. Расчёт rate в примере — это не совсем логика. Просто атрибут модели, который можно рассчитать, вместо того, чтобы хранить. Такие атрибуты вполне можно оставлять в модели.
2. Именно логику (операции над моделями) лучше отделять от них — можно просто в отдельный модуль вынести. Либо в менеджер, если они низкоуровневые.
3. Если объект, представляемый в модели, сложен (предполагает большое количество данных в разных форматах с кучей связанных объектов, необходимостью кэширования и так далее), то имеет смысл оставить модель представлять уровень БД (для общения с базой, миграций и так далее), а для представления объекта в логике реализовать отдельный класс, объекты которого будут инициализироваться данными из модели.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы