Scheiding van bedrijfslogica en gegevenstoegang in django

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

Ik schrijf een project in Django en ik zie dat 80% van de code in het bestand modellen.py staat. Deze code is verwarrend en na een bepaalde tijd begrijp ik niet meer wat er werkelijk gebeurt.

Dit is wat me stoort:

  1. Ik vind het lelijk dat mijn model niveau (dat alleen verantwoordelijk was voor het werk met gegevens uit een database) is ook het verzenden van e-mail, het lopen op API naar andere services, enz.
  2. Ook vind ik het onaanvaardbaar om bedrijfslogica in het uitzicht, omdat het op deze manier moeilijk te controleren is. In mijn toepassing zijn er bijvoorbeeld ten minste drie manieren om nieuwe exemplaren van Gebruiker te maken, maar technisch gezien zou het ze uniform moeten maken.
  3. Ik merk niet altijd wanneer de methoden en eigenschappen van mijn modellen worden niet-deterministisch en wanneer ze bijwerkingen ontwikkelen.

Hier is een eenvoudig voorbeeld. In het begin was het Gebruiker-model als volgt:

class User(db.Models): def get_present_name(self): return self.name of "Anonymous" def active(self): self.status = "geactiveerd" self.save() 

In de loop van de tijd is het dit geworden:

class User(db .Models): def get_present_name(self): # property werd niet-deterministisch in termen van database # data wordt van een andere service gehaald door api return remote_api.request_user_name(self.uid) of "Anoniem" def active(self): # method heeft nu een bijwerking (stuur bericht naar gebruiker) self.status = "geactiveerd" self.save() send_mail("Uw account is geactiveerd!", "…", [self.email]) 

Ik wil entiteiten scheiden in mijn code:

  1. Entiteiten van mijn database, persistentieniveau: welke gegevens bewaart mijn toepassing?
  2. Entiteiten van mijn applicatie, bedrijfslogica-niveau: wat doet mijn applicatie?

Wat zijn de goede praktijken om zo'n een benadering die in Django kan worden toegepast?