Trennung von Geschäftslogik und Datenzugriff in Django

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

Folgendes stört mich:

Ich finde es hässlich, dass meine Modellebene (die eigentlich nur für die Arbeit mit Daten aus einer Datenbank verantwortlich sein sollte) auch E-Mails sendet, über die API zu anderen Diensten wechselt usw.Außerdem finde ich es inakzeptabel, Geschäftslogik in der Ansicht zu platzieren, da es auf diese Weise schwierig wird, sie zu kontrollieren. In meiner Anwendung gibt es beispielsweise mindestens drei Möglichkeiten, neue Instanzen von zu erstellenUser, aber technisch sollte es sie einheitlich schaffen.Ich bemerke nicht immer, wann die Methoden und Eigenschaften meiner Modelle nicht deterministisch werden und wann sie Nebenwirkungen entwickeln.

Hier ist ein einfaches Beispiel. Zuerst dieUser Modell war wie folgt:

class User(db.Models):

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

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

Im Laufe der Zeit stellte sich Folgendes heraus:

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])

Ich möchte, dass Entitäten in meinem Code getrennt werden:

Entitäten meiner Datenbank, Datenbankebene: Was enthält meine Anwendung?Entitäten meiner Anwendung, Geschäftslogikebene: Was kann meine Anwendung machen?

Was sind die guten Praktiken, um einen solchen Ansatz zu implementieren, der in Django angewendet werden kann?

Antworten auf die Frage(9)

Ihre Antwort auf die Frage