Какими методами должен быть метод модельного класса? - PullRequest
5 голосов
/ 19 сентября 2011

Это проблема дизайна.

Предположим, что у нас есть модель такого типа в Django:

class Payment(models.Model):
  purchase = ForeignKeyField(Purchase)
  net_price = DecimalField()
  is_accepted = BooleanField()

  def set_accept(self):
    # there will be some logic, which touch purchase, send emails etc.

  def price_with_tax(self):
    return net_price * (1. + TAX)

У нас также есть другой файл с именем actions.py и мы реализуем там другие действия.Наша задача - определить, какие методы следует размещать в models.py , а в actions.py .Вы знаете какой-нибудь общий подход, руководство или что-то подобное?Я хочу максимально использовать существующие решения.

Спасибо

Ответы [ 2 ]

6 голосов
/ 19 сентября 2011

Общее соглашение в средах MVC (например, Django) - размещать как можно больше логики в ваших моделях.Это служит многим целям:

  • Это связывает вашу логику с вашими данными (хорошо).
  • Позволяет легко найти одно место в коде для всех методов манипулирования данными.
  • Позволяет запускать методы на ваших моделях напрямую, не полагаясь на представления (упрощает тестирование).
  • Дает вам действительно «чистый» API для использования в ваших шаблонах, например: {{ object.price_with_tax }}, в отличие от рендеринга разных представлений для разных поведений.

Для макета вашего проекта вы должны попытаться сохранить любой код, работающий с моделями, в файле models.py и избегать использованияactions.py или helpers.py, если вам действительно это не нужно.Если у вас есть большое количество кода, который не подходит для вашего файла models.py (может быть, вы реализуете алгоритмы или что-то в этом роде), соглашение заключается в использовании helpers.py.

.больше вещей, которые вы можете сделать позже, чтобы сохранить иерархию приложений в чистоте и организованности, но это основной смысл всего этого.

0 голосов
/ 19 сентября 2011

Стандартным способом в django является помещение кода, который работает на основе строк таблицы, непосредственно в модель, и кода, который работает с несколькими строками или на основе таблицы, в менеджер.

class MyManager(models.Manager):
    def do_something_with_some_rows(self):
        query = self.filter(...)
        result = do_someting_with_this_query(query)
        return result

class MyModel(models.Model):
    objects = MyManager()

тогда вы можете использовать этот менеджер, как этот

>>> result = MyModel.objects.do_something_with_some_rows()

, как сказал rdegges, это делает ваш API намного чище и проще в использовании, а также намного проще для тестирования.

https://docs.djangoproject.com/en/dev/topics/db/managers/#managers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...