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?