Hoje, entrei em um debate acalorado com outro desenvolvedor da minha organização sobre onde e como adicionar métodos às classes mapeadas do banco de dados. Utilizamos sqlalchemy
e grande parte da base de código existente em nossos modelos de banco de dados é pouco mais que um conjunto de propriedades mapeadas com um nome de classe, uma tradução quase mecânica de tabelas de banco de dados em objetos python.
No argumento, minha posição era de que o principal valor do uso de um ORM era o fato de você poder anexar comportamentos e algoritmos de baixo nível às classes mapeadas. Os modelos são primeiro as classes e secundariamente persistentes (eles podem ser persistentes usando xml em um sistema de arquivos, você não precisa se preocupar). Sua opinião era de que qualquer comportamento é "lógica de negócios" e necessariamente pertence a qualquer lugar, exceto no modelo persistente, que deve ser usado apenas para persistência do banco de dados.
Certamente acho que existe uma distinção entre o que é lógica de negócios e deve ser separado, pois ele tem algum isolamento do nível mais baixo de como isso é implementado e lógica de domínio, que acredito ser a abstração fornecida pelas classes de modelo discuti no parágrafo anterior, mas estou tendo dificuldade em entender o que é isso. Tenho uma noção melhor do que pode ser a API (que, no nosso caso, é HTTP "ReSTful"), pois os usuários invocam a API com o que desejam fazer , diferente do que têm permissão para fazer e como ela é feito.
tl; dr: Que tipos de coisas podem ou devem seguir um método em uma classe mapeada ao usar um ORM e o que deve ser deixado de fora para viver em outra camada de abstração?