Separação da lógica de negócios e acesso a dados no django

Estou escrevendo um projeto no Django e vejo que 80% do código está no arquivomodels.py. Esse código é confuso e, depois de um certo tempo, deixo de entender o que realmente está acontecendo.

Aqui está o que me incomoda:

Acho feio que o meu nível de modelo (que deveria ser responsável apenas pelo trabalho com dados de um banco de dados) também esteja enviando e-mail, andando na API para outros serviços, etc.Além disso, considero inaceitável colocar a lógica de negócios na exibição, pois dessa forma fica difícil controlá-la. Por exemplo, na minha aplicação há pelo menos três maneiras de criar novas instâncias deUser, mas tecnicamente deve criá-los uniformemente.Nem sempre percebo quando os métodos e propriedades de meus modelos se tornam não determinísticos e quando desenvolvem efeitos colaterais.

Aqui está um exemplo simples. Em primeiro lugar,User modelo foi assim:

class User(db.Models):

    def get_present_name(self):
        return self.name or 'Anonymous'

    def activate(self):
        self.status = 'activated'
        self.save()

Com o tempo, isso se transformou em:

class User(db.Models):

    def get_present_name(self): 
        # property became non-deterministic in terms of database
        # data is taken from another service by api
        return remote_api.request_user_name(self.uid) or 'Anonymous' 

    def activate(self):
        # method now has a side effect (send message to user)
        self.status = 'activated'
        self.save()
        send_mail('Your account is activated!', '…', [self.email])

O que eu quero é separar entidades no meu código:

Entidades do meu banco de dados, nível de banco de dados: O que contém meu aplicativo?Entidades do meu aplicativo, nível de lógica de negócios: o que pode fazer meu aplicativo?

Quais são as boas práticas para implementar tal abordagem que podem ser aplicadas no Django?

questionAnswers(9)

yourAnswerToTheQuestion