Джанго и доменный слой - PullRequest
       7

Джанго и доменный слой

4 голосов
/ 28 ноября 2010

Как организовать мой доменный слой с помощью django?

Я знаю, что могу написать собственные менеджеры для хранения моих запросов, но что, если я хочу что-то более гибкое, например шаблон спецификации.

Существуют ли шаблоны доменов, уникальные для Django?

В настоящее время я разрабатываю большое приложение, использующее Django, и я хотел бы знать, как правильно сделать слой домена.

1 Ответ

5 голосов
/ 28 ноября 2010

Этот вопрос немного субъективен, но вот мои два цента:

  • Бизнес-логика для одновременной смены нескольких объектов обычно должна быть у менеджера.
  • Специальная логика для создания объекта должна быть в менеджере, подумайте MyModel.objects.create_complex(foo, bar)
  • Бизнес-логика для вычисления пользовательской информации, обновления какого-либо сложного поля и т. Д. Должна быть в методах (или свойствах) ваших моделей, подумайте my_instance.get_accumulated_interest(). Они не должны сохранять модель, только обновлять некоторые поля и затем возвращать.
  • Бизнес-логика для проверки информации должна идти либо в clean методах модели, либо в виде clean методов в специальных формах. Если он используется в модели, его проще повторно использовать из разных частей системы.
  • В общем, если вы не можете найти место для размещения логики, которая имеет смысл, я помещу их в представления.
  • Автономная обработка должна выполняться в пользовательских командах управления, и вы сможете повторно запускать одну и ту же команду с одними и теми же аргументами несколько раз без каких-либо нежелательных эффектов.

Когда я говорю «должен идти в X», я имею в виду, что эти части системы должны вызывать ваши собственные модули, которые могут быть полностью отделены от Django. Это может упростить тестирование этих функций по отдельности.

Изменить:

Для «шаблона спецификации» я бы предложил написать модуль более высокого уровня, который вызывает методы менеджера для фильтрации объектов. С Q объектами вы можете создавать универсальные фильтры, которые вы можете использовать следующим образом:

q = Q(field__isnull = False) | Q(otherfield__isnull = False)
objects = Model.objects.filter(q)

Редактировать II:

Меня просто поразило: Python допускает очень общее программирование. Классы и функции первоклассные граждане. Рассмотрим следующий пример:

def HasFooBar(model_class):
    return list(model_class.objects.filter(somefield__contains = 'foobar'))

def BarHasBaz(model_class, arg):
    return list(model_class.objects.filter(somefield = arg))

objects = HasFooBar(MyModel) + BarHasBaz(OtherModel, baz)

Вы видите, что я только что сделал там? :)

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