Trennung von Geschäftslogik und Datenzugriff in Django

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

Ich schreibe ein Projekt in Django und sehe, dass 80 % des Codes in der Datei models.py enthalten sind. Dieser Code ist verwirrend und nach einer gewissen Zeit verstehe ich nicht mehr, was wirklich passiert.

Was mich stört:

  1. Ich finde es hässlich, dass mein Modell Ebene (die nur für die Arbeit mit Daten aus einer Datenbank zuständig sein sollte) sendet auch E-Mails, läuft über die API zu anderen Diensten usw.
  2. Außerdem finde ich es inakzeptabel, Geschäftslogik einzubauen die Sicht, denn so wird es schwierig, sie zu kontrollieren. Zum Beispiel gibt es in meiner Anwendung mindestens drei Möglichkeiten, neue Instanzen von User zu erstellen, aber technisch gesehen sollte es sie einheitlich erstellen.
  3. Ich merke nicht immer, wann die Methoden und Eigenschaften meiner Modelle nicht-deterministisch werden und wenn sie Nebeneffekte entwickeln.

Hier ist ein einfaches Beispiel. Zuerst sah das User-Modell so aus:

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

Mit der Zeit wurde daraus:

class User(db .Models): def get_present_name(self): # Eigenschaft wurde in Bezug auf die Datenbank nicht deterministisch # Daten werden von einem anderen Dienst von api übernommen return remote_api.request_user_name(self.uid) oder "Anonymous" def activate(self): # Methode hat jetzt einen Nebeneffekt (Nachricht an Benutzer senden) self.status = "aktiviert" self.save() send_mail("Ihr Konto ist aktiviert!", "‚Ķ", [self.email]) 

Was ich möchte, ist Entitäten in meinem Code zu trennen:

  1. Entitäten meiner Datenbank, Persistenzebene: Welche Daten behält meine Anwendung?
  2. Entitäten meiner Anwendung, Ebene der Geschäftslogik: Was macht meine Anwendung?

Was sind die guten Praktiken, um eine solche zu implementieren n Ansatz, der in Django angewendet werden kann?