Разделение бизнес-логики и доступа к данным в django

| | | | | | | | | | | | | | | | | |

Я пишу проект на Django и вижу, что 80 % кода находится в файле models.py. Этот код сбивает с толку и через определенное время я перестаю понимать, что происходит на самом деле.

Меня вот что беспокоит:

  1. Мне некрасиво, что моя модель уровень (который должен был отвечать только за работу с данными из БД) это еще и отправка почты, хождение по API к другим сервисам и т.д.
  2. Также считаю неприемлемым размещать бизнес-логику в вид, потому что таким образом его становится трудно контролировать. Например, в моем приложении есть как минимум три способа создания новых экземпляров User, но технически оно должно создавать их единообразно.
  3. Я не всегда замечаю, когда методы и свойства моих моделей становятся недетерминированными, и когда они развивают побочные эффекты.

Вот простой пример. Сначала модель User была такой:

class User(db.Models): def get_present_name(self): return self.name или "Anonymous" def enable(self): self.status = "activated" self.save() 

Со временем это превратилось в это:

class User(db .Models): def get_present_name(self): # свойство стало недетерминированным с точки зрения базы данных # данные берутся из другого сервиса с помощью API return remote_api.request_user_name(self.uid) или "Анонимный" def активировать(self): # метод теперь имеет побочный эффект (отправить сообщение пользователю) /pre> 

Я хочу разделить сущности в своем коде:

  1. Сущности моей базы данных, уровень сохраняемости: какие данные хранит мое приложение?
  2. Сущности моего приложения, уровень бизнес-логики: Что делает мое приложение?

Каковы передовые методы реализации такого какой подход можно применить в Django?