Этот вопрос немного субъективен, но вот мои два цента:
- Бизнес-логика для одновременной смены нескольких объектов обычно должна быть у менеджера.
- Специальная логика для создания объекта должна быть в менеджере, подумайте
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)
Вы видите, что я только что сделал там? :)