Задать вопрос
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
  • Вопрос задан
  • 2620 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 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. Если объект, представляемый в модели, сложен (предполагает большое количество данных в разных форматах с кучей связанных объектов, необходимостью кэширования и так далее), то имеет смысл оставить модель представлять уровень БД (для общения с базой, миграций и так далее), а для представления объекта в логике реализовать отдельный класс, объекты которого будут инициализироваться данными из модели.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
Strikt Москва
от 100 000 до 180 000 ₽
Крона Лабс Екатеринбург
от 200 000 ₽
Sim-Ba Pay Санкт-Петербург
от 180 000 ₽