Séparation de la logique métier et de l’accès aux données dans Django

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

J'écris un projet dans Django et je vois que 80 % du code se trouve dans le fichier models.py. Ce code est déroutant et, au bout d'un certain temps, je ne comprends plus ce qui se passe réellement.

Voici ce qui me dérange :

  1. Je trouve moche que mon modèle niveau (qui était censé être responsable uniquement du travail avec les données d'une base de données) envoie également des e-mails, marche sur l'API vers d'autres services, etc.
  2. De plus, je trouve inacceptable de placer la logique métier dans la vue, car de cette façon, il devient difficile à contrôler. Par exemple, dans mon application, il existe au moins trois façons de créer de nouvelles instances de User, mais techniquement, il devrait les créer de manière uniforme.
  3. Je ne remarque pas toujours quand les méthodes et les propriétés de mes modèles deviennent non déterministes et lorsqu'elles développent des effets secondaires.

Voici un exemple simple. Au début, le modèle User était comme ceci :

class User(db.Models): def get_present_name(self): return self.name or "Anonymous" def activate(self): self.status = "activated" self.save() 

Au fil du temps, cela s'est transformé en ceci :

class User(db .Models): def get_present_name(self): # la propriété est devenue non déterministe en termes de base de données # les données sont extraites d'un autre service par api return remote_api.request_user_name(self.uid) ou "Anonymous" def activate(self): # méthode a maintenant un effet secondaire (envoyer un message à l'utilisateur) self.status = "activated" self.save() send_mail("Votre compte est activé !", "‚Ķ", [self.email]) 

Ce que je veux, c'est séparer les entités dans mon code :

  1. Entités de ma base de données, niveau de persistance : Quelles données mon application conserve-t-elle ?
  2. Entités de mon application, niveau logique métier : que fait mon application ?

Quelles sont les bonnes pratiques pour mettre en place une telle n approche applicable dans Django ?